Java中的类导入和包导入之间有什么区别?

时间:2009-10-12 10:54:50

标签: java import

在Java中,我们既可以导入单个类,也可以导入整个类(包)。

作为一个例子

import java.util.*

包括

import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.List;
import java.util.Iterator;
import java.util.Map;

除了代码的长度之外,以任何方式使用每种方法有什么特别的优势吗?内存分配?性能?

6 个答案:

答案 0 :(得分:26)

两者都没有性能或内存分配优势 - 它们都将编译为相同的字节码。

import语句是告诉编译器在哪里找到源代码所引用的类。

但是,仅按类导入是有利的。如果在两个包中存在一个具有完全相同名称的类,则会引起关于引用哪个类的冲突。

一个这样的例子是java.awt.List类和java.util.List类。

假设我们想要使用java.awt.Paneljava.util.List。如果源导入包如下:

import java.awt.*;
import java.util.*;

然后,提到List类将会变得暧昧:

List list; // Which "List" is this from? java.util? java.awt?

但是,如果显式导入,则结果为:

import java.awt.Panel;
import java.util.List;

List list; // No ambiguity here -- it refers to java.util.List.

答案 1 :(得分:6)

您选择使用的导入仅在解析类名时产生编译时差异。

所以唯一的优点/缺点适用于可读性。

只导入您需要的最低值似乎更好,因为有人可以查看您实际使用的内容。也就是说,IDE可能会处理这个问题,这是一个没有实际意义的问题。

答案 2 :(得分:2)

应用程序的内存分配或性能完全没有差别; import语句在程序运行时根本没有任何影响。它们只是指示编译器在哪里(在哪些包中)查找类。

但是,最好避免使用通配符语法并始终使用特定的导入。这样做可以避免在与程序的未来版本库兼容方面出现问题。

假设您在程序中使用某个库的1.0版,并执行import somelibrary.*;。假设您的程序有一个名为X的类。现在,该库的1.1版本出来了,您想要使用它。假设在库的1.​​1版本中有一个名为X的新类。

如果您使用了通配符语法,则突然也会从库中导入X。然后编译器会给你一个错误,因为你的程序中已经有一个类X,编译器无法从库中区分你的XX

如果您只从库中导入实际需要的类,则不会出现此问题,因为您不会从库的1.1版本自动导入X

答案 3 :(得分:2)

在编译时执行显式导入更安全,因为不存在类冲突的可能性。 e.g。

import java.sql.*;
import java.util.*;
如果您尝试使用Date类(即从哪个包?),

会导致问题。

但除此之外,没有性能或内存方面。这纯粹是一个编译时问题。

答案 4 :(得分:2)

使用'*'导入的优点是代码行数更少,输入更少。如果您使用“哑”文本编辑器而不是IDE进行编码比使用省略号隐藏导入并且可以半自动添加导入更为重要。

使用'*'导入的缺点是:

  • 偶尔会遇到输入的类名冲突;例如当某个类名用于不同包中的类并导入它们时。
  • 通过查看导入,您无法看到类显式依赖项。但是,如果您的IDE可以通过其他方式向您显示依赖关系,那么这一点就不那么重要了。

答案 5 :(得分:0)

任何体面的IDE都会为您提供更多的导入语句。如果这是一个问题,请获得更好的IDE。

IntelliJ做到了; Eclipse也是如此。我自己不使用NetBeans,但我敢打赌它确实如此。