好的,如果我有一个项目使用:
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.*
我反对它,因为我输入了很多我不需要的东西。我正在考虑因为它使文件中的字符少得多。
答案 0 :(得分:17)
没有区别。这些只是一个编译时构造。
答案 1 :(得分:12)
不,没有任何区别。
根据The Java Virtual Machine Specifications, Second Edition,Chapter 5: Loading, Linking and Initializing说明如下:
动态Java虚拟机 加载(§2.17.2),链接(§2.17.3)和 初始化(§2.17.4)类和 接口。加载是过程 找到一个二进制表示 带有a的类或接口类型 特定的名称和创建一个类 或该二进制文件的接口 表示。链接是一个过程 取一个类或接口和 将它组合到运行时状态 这样的Java虚拟机 可以执行。
在编译时,没有类的链接,因此,使用import
的通配符没有任何区别。其他类不会包含在生成的class
文件中。
事实上,如果你查看class
文件的字节码(通过javap
或这样的反汇编程序),你将找不到任何import
语句,因此或多或少源中import
个语句的数量不会影响class
文件的大小。
这是一个简单的实验:尝试编写程序,使用通配符编译import
,使用显式导入编译另一个。{生成的class
文件大小应相同。
在特定类上使用显式import
语句可能不太可读(如果不使用像Eclipse这样的IDE会为你编写它,那就麻烦了),但是可以让你处理类的重叠两个包中的名字。
例如,java.util
和java.awt
包中都有List
个类。通过导入两个包,名为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
那么你就不走运了;你需要明确使用他们的完全限定的类名。
答案 2 :(得分:3)
Java import
语句不会向类文件添加任何大小。它允许编译器推导出编译时引用的名称。
行唯一的区别
import java.util.*;
make是你可以写的:
Set<String> set;
而不是:
java.util.Set<String> set;
答案 3 :(得分:2)
老实说,你为什么要关心班级文件的大小?
更好的做法是明确包含所有需要的类而不是“import foo.bar。*”。
这使您的代码更具可读性,更易于维护。
答案 4 :(得分:1)
我认为Java只包含你真正需要的东西......所以使用其中一种方式在最终编译版本中没有任何区别。
答案 5 :(得分:1)
生成的类文件中根本没有变化。
导入只对编译器有影响(如果必须索引很多目录,可能需要更长的时间),当然还有源代码(当你可以确切地看到哪些类时,IMO更易于维护)使用)。
答案 6 :(得分:1)
如果您有兴趣缩小班级规模,the game making competition java4k会有一些提示,例如此页http://www.ahristov.com/tutorial/java4k-tips/java4k-tips.html
答案 7 :(得分:1)
首先,请务必查看我的“按需导入是邪恶的!”文章:
http://javadude.com/articles/importondemandisevil.html
你应该 从不 使用*语法!当代码添加到另一个库时,它可能导致程序停止编译!
现在,这是导入真正起作用的方式:
当你说
时import a.b.c.Foo;
所有这一切都告诉编译器当你说“Foo”时,你的意思是“a.b.c.Foo”。然后,编译器将在生成的字节码中用a.b.c.Foo替换所有出现的Foo。
当你说
时import a.b.c.*;
这告诉编译器“当你看到一个你不认识的符号XXX时,检查是否有a.b.c.XXX”如果找到,编译器将用生成的字节码中的a.b.c.XXX替换XXX。
如果多个“*”导入与未知符号匹配,则会出现歧义的编译错误。
答案 8 :(得分:0)
之前的帖子中没有任何差异,但是我使用的是偏好 严格导入,因为我发现它在我看来代码更喜欢阅读
答案 9 :(得分:0)
作为对早期答案的补充,您应该看到的唯一区别是,当您明确告诉您想要import
编辑的内容时,编译应该更快位,而不是给出通配符,可包括数千(数千)不必要的包和类。