2009-02-25 18 views
5

好了,所以如果我有使用的项目:这将使Class文件变大吗? import java.awt。*,或者一堆或单个import语句?

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.Color; 
import java.awt.Polygon; 

难道让类文件较小的使用方法:

import java.awt.* 

我想反对,因为我输入了很多我不需要的东西。我在想它,因为它使文件有很少的字符。

+0

这让很多从C/C++转移到Java的人翘首以盼。 – 2009-02-25 22:08:37

回答

16

没有区别。这些只是一个编译时构造。

1

我认为Java只包含那些你真正需要的东西......所以在最终编译版本中不会有任何区别使用这种或那种方式。

2

老实说,你为什么关心你的类文件的大小?

明确包含所有需要的类而不是执行“import foo.bar。*”是一个更好的做法。

这使您的代码更具可读性,更易于维护。

1

生成的类文件完全没有变化。

导入只对编译器有影响(如果需要索引很多目录,导入时间可能会稍长一些),当然还有源代码(当你可以清楚地看到哪些是IMO维护时类被使用)。

3

Java import语句不会为类文件添加任何大小。它允许编译器在编译时推断出引用的名称。

唯一不同的线路

import java.util.*; 

做的是,你可以写:

Set<String> set; 

而不是:

java.util.Set<String> set; 
11

没有,在所有没有区别。

The Java Virtual Machine Specifications, Second EditionChapter 5: Loading, Linking and Initializing说以下内容:

Java虚拟机动态 负载(§2.17.2),链接(§2.17.3),并 初始化(§2.17.4)类和 接口。加载是 的过程,该过程查找具有 特定名称的 类别或接口类型的二进制表示,并创建类别 或来自该二进制 表示的接口。链接过程 采取类或接口和 将其组合到Java虚拟机的运行时状态 ,以便它可以执行 。

在编译时,没有链接类,因此使用通配符import ing没有区别。其他类不包括在所产生的class文件中。

事实上,如果你看一下class文件的字节码(通过javap或反汇编等),你不会找到任何import语句,所以在您的源具有import陈述或更多数量较少,不会影响class文件的大小。

这里有一个简单的实验:尝试编写一个程序,并与import S使用通配符编译,和另一个明确的进口。生成的class文件应该具有相同的大小。


在特定的类使用显式import陈述也许少可读(和麻烦,如果不使用像Eclipse的IDE将写吧),但将允许您处理类的重叠两个包中的名字。

例如,在java.utiljava.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.Listjava.awt.List,那么你运气不好;你需要明确地使用他们完全合格的类名。

0

没有在先前的文章指出,然而,作为一个偏爱我用 严格的进口,因为我觉得它使在我看来代码更普莱阅读

0

在补充前面的回答没有什么区别,唯一的区别你应该看到的是,编制应该是更快,当你明确地告诉你想要什么import版,而不是给一个通配符,可以包括不必要的包和类数千(在千)。

1

首先,一定要看看我的“导入点播是邪恶的!”文章:

http://javadude.com/articles/importondemandisevil.html

你应该从未使用*语法!这可能会导致程序停止时的代码是添加到另一个库编译!

现在,这里是如何导入确实有效:

当你说

import a.b.c.Foo; 

这样做只是告诉编译器,当你说“富”,你真的是“a.b.c.Foo”。然后,编译器将用生成的字节码中的a.b.c.Foo替换所有Foo的出现。

当你说

import a.b.c.*; 

这告诉编译器“当你看到你不认识的符号XXX,检查是否有一个abcXXX”如果找到,编译器将取代XXX生成的字节码中的abcXXX。

如果多个“*”导入与未知符号相匹配,则会出现模糊不清的编译器错误。