好的,如果我有一个项目使用:
import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Dimension; import java.awt.Font; import java.awt.Color; import java.awt.Polygon;
它会使Class文件更小:
import java.awt.*
我反对它,因为我输入了许多我不需要的东西.我正在考虑因为它使文件中的字符少得多.
没有不同.这些只是一个编译时构造.
不,没有任何区别.
根据Java虚拟机规范,第二版,第5章:加载,链接和初始化,说明如下:
Java虚拟机动态加载(§2.17.2),链接(§2.17.3)和初始化(§2.17.4)类和接口.加载是查找具有特定名称的类或接口类型的二进制表示并从该二进制表示创建类或接口的过程.链接是获取类或接口并将其组合到Java虚拟机的运行时状态以便可以执行的过程.
在编译时,没有类的链接,因此,使用通配符进行import
输入没有区别.其他类不会一起包含在生成的class
文件中.
实际上,如果你查看class
文件的字节码(通过javap
或这样的反汇编程序),你将找不到任何import
语句,因此源中包含更多或更少数量的import
语句不会影响class
文件的大小.
这是一个简单的实验:尝试编写程序,import
使用通配符编译s,使用显式导入编译另一个.生成的class
文件大小应相同.
import
在特定类上使用显式语句可能性较差(如果不使用像Eclipse这样的IDE会为你编写它,那就麻烦了),但是允许你在两个包中处理类名的重叠.
例如,包和包List
中都有一个类.通过导入两个包,名为的类将发生冲突:java.util
java.awt
List
import java.util.*; import java.awt.*; // ... snip ... // List l; // which "List" are we talking about?
通过仅导入您需要的特定类,可以在某种程度上避免这些冲突:
import java.util.Hashmap; import java.awt.List; // .. snip ... // List l; // Now we know for sure it's java.awt.List
当然,如果你不得不同时使用它们java.util.List
,java.awt.List
那么你就不幸了; 你需要明确地使用他们的完全限定的类名.