【问题标题】:why autoimport only java.lang package?为什么只自动导入 java.lang 包?
【发布时间】:2025-11-26 02:15:02
【问题描述】:

我知道 java.lang 包是由我们编写的每个 java 程序自动导入的,因此我们可以自动使用其中的所有类。

我的问题是为什么不自动导入java.util 和其他包呢?那肯定会节省一些打字:)

所以请解释一下为什么没有这样做。

【问题讨论】:

  • 如果我们可以将它们全部放在一个包中并自动导入,那么拥有单独的包有什么用?想一想。
  • 雅..想了想。这就是问题的原因!!为什么没有完成?
  • 因为否则您将根本没有包,而是会出现不可调和的名称冲突..

标签: java import


【解决方案1】:

不要过多地自动导入的一个很好的理由是避免命名空间冲突。例如,如果java.util 中的所有内容都是自动导入的,然后您想引用另一个名为“Map”的类,则必须通过其完全限定名称来引用它。

针对此线程中的其他答案,import 实际上并没有修改您的类文件的内部表示。事实上,这是 JVM 规范中描述类文件结构的 link:请注意导入没有存储在任何地方。

【讨论】:

  • +1:不仅如此,甚至在 Java 标准库中,一些类名也会出现在不同的命名空间中。例如:java.util.List 和 java.awt.List。
  • 这是一种“因为它是”的答案。当然,如果您想要另一个 Map (java.util),那么您必须完全限定它,但如果您想要另一个 Process (java.lang),您仍然必须这样做。问题仍然存在:java.lang 中的类集有什么特别之处,以至于它总是被导入,而没有别的? Gosling 是否认为我们会比 List 更频繁地使用 StrictMath?
  • 我不同意这是一个毫无意义的答案。他问为什么不自动导入其他包 - 他没有问我们为什么自动导入java.lang。但是,如果您要问这个问题,我猜想答案与 Javadocs 中的包描述有关——“提供 Java 编程语言设计的基础类。”。在不讨论该声明的有效性的情况下,这超出了本线程的范围,我想说,如果您认为某个特定的包是您正在设计的语言的基础,那么您可能会认为自动适合跨度>
  • @Ken。实际上,是的,考虑到 List 在 Java 的第一个版本中不存在。
  • @danben 还有其他自动导入的包吗?
【解决方案2】:

所有优秀的IDE都会自动解析你的导入,只有在发生冲突时才会提示(两个包具有相同的类名)。

【讨论】:

    【解决方案3】:

    因为 java.lang 有核心的 Java 语言类,而 java.util 例如没有。

    但是其他一些语言,比如 Groovy 会自动为你导入 java.util :)

    【讨论】:

      【解决方案4】:

      我认为 java.lang 背后的想法是这些类都与语言和运行时有某种联系,这是特殊的,无法自行实现。原始包装器、VM 安全性、权限和检查、包和类加载——所有这些都必须内置到 Java 系统中。 java.util 中的所有内容,比如集合,虽然非常有用,但可以在纯 Java 中实现。它的某些部分(想到时区)甚至由第三方库实现得更好。

      或者至少在 Java 1.0 时代是这样。例如,今天,Iterator 也是该语言不可或缺的一部分,因为它被 for-each 循环自动使用,对吧?但是向后兼容性对于 Java 来说始终是一件大事,所以我们要永远忍受这种不一致。

      【讨论】:

      • 这并不能真正解释事情。他们可能只是自动导入任何内容或自动导入的不仅仅是 java.lang。自动导入是一项便利功能。
      【解决方案5】:

      即使使用java.lang.System,我也遇到了命名空间冲突(我们的应用程序包含一个名为 System 的类)。显式导入解决了我的问题,但我花了几分钟时间才指出 com.mycompany.classes.System 不是由 Eclipse 自动为标识符 System 导入的,因为它已经存在于 java.lang 中。

      无论如何,用过多的标识符污染类范围并不是一个好主意,因为你的代码会org.classes.**look** com.application.**like** com.classes.**this**.

      自动导入java.lang 是一个好主意,因为它包含java 中使用的非常核心的类和接口。

      【讨论】:

        【解决方案6】:

        @gameover,可能每个java程序都需要来自java.lang的类,

        但是 java.util 类包含我需要或不需要的类,这取决于程序员。所以java有java.lang的默认配置,但是我们需要根据我们的程序导入java.util类。

        【讨论】:

          【解决方案7】:

          自动导入也会导致一些内存问题,有时可能会发生冲突。 例如:Java 和 SQL 中的日期类型。

          还有在 Java.lang 包中定义的基本核心 java 对象。 例如:任何数据类型和返回类型都在 java.lang 包中声明,所以要执行一些基本程序,我们也需要这个包导入。

          【讨论】:

          • 它不会导致运行时内存问题。而且编译时间问题很可能无关紧要
          【解决方案8】:

          java.lang 包为构建的 java 程序提供了基础类。对象是类层次结构的根,因此无论程序员是初学者还是专家,它都需要可供每个程序员使用。

          如果我们谈论其他软件包,它们用于扩大程序。例如,java.util 包,仅在需要 Collection 类时使用。虽然在每个程序中都不使用集合类,但基本数据类型对于每个 Java 程序都是必不可少的。

          为了避免在程序中不必要地加载其他类,其他包不会自动导入,而基本包 java.lang 会自动导入。

          【讨论】:

            【解决方案9】:

            成为java.lang包是默认的有不同的原因 1) 实际上,无论我们在java程序中声明什么变量,都将存储在对象中,对象类在java.lang包中是可用的。它是类层次结构的超类,我们在对象类方法中执行了许多操作,如线程编程。 2) 很多时候它是开发程序所需的类,该类在 java.lang 包中可用, 所以,必须要导入,java人开发jdk的时候,是默认包,

            【讨论】:

              【解决方案10】:

              没有java.lang 包,开发是不可能的。 但是没有java.utiljava.io 或任何其他包,我们仍然可以编写任意数量的程序。 这就是默认导入java.lang包的原因。

              【讨论】: