为什么autoimport只有java.lang包?

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

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

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

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

为了响应此线程中的其他答案, import实际上不会修改类文件的内部表示。 实际上,这里是一个描述类文件结构的JVM规范的链接 :请参阅导入不存储在任何地方。

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

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

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

我认为java.lang背后的想法是这些类都有一些特殊的语言和运行时连接,并且不能自己实现。 原始包装器,VM安全性和权限以及检查,包和类加载 – 必须内置到Java系统的所有内容。 java.util中的所有东西,如集合,虽然非常有用,但可以用纯Java实现。 它的某些部分(时区浮现在脑海中)甚至被第三方库更好地实现了。

或者至少,在Java 1.0天中这是真的。 今天,例如,Iterator也是该语言的组成部分,因为它会被for-each循环自动使用,对吧? 但是向后兼容性对Java来说总是很重要,所以我们永远忍受这种不一致。

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

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

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

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

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

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

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

为避免程序中其他类的不必要的负载,在自动导入基本包java.lang时,不会自动导入其他包。

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

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

无论Java.lang包中定义了什么基础核心java对象。 例如:任何数据类型和返回类型都在java.lang包中声明,所以要做一些基本程序我们也需要这个包导入。

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