Java中的类导入和包导入有啥区别? [复制]
Posted
技术标签:
【中文标题】Java中的类导入和包导入有啥区别? [复制]【英文标题】:Any difference between class imports and package imports in Java? [duplicate]Java中的类导入和包导入有什么区别? [复制] 【发布时间】:2010-12-05 22:49:04 【问题描述】:在 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;
除了代码长度之外,以任何方式使用每种方法是否有任何特定优势?内存分配?表现?
【问题讨论】:
我正要问这个。谢谢! 【参考方案1】:您的应用程序的内存分配或性能完全没有区别; import 语句在运行时对您的程序根本没有任何影响。它们只是告诉编译器在哪里(在哪些包中)查找类的指令。
但是,最好避免使用通配符语法并始终使用特定的导入。这样做可以避免您的程序与未来版本的库的兼容性问题。
假设您在程序中使用某个库的 1.0 版,并且您使用了import somelibrary.*;
。假设您的程序有一个名为X
的类。现在,该库的 1.1 版发布了,您想使用它。假设在库的 1.1 版中偶然有一个名为 X
的新类。
如果你使用通配符语法,你突然也从库中导入了X
。然后编译器会给你一个错误,因为你的程序中已经有一个类X
,编译器无法从库中区分你的X
和X
。
如果你只从库中导入你真正需要的类,那么你就不会遇到这个问题,因为你不会自动从库的 1.1 版导入X
。
【讨论】:
【参考方案2】:两者都没有性能或内存分配优势——它们都将编译为相同的字节码。
import
语句是告诉编译器在哪里可以找到源代码所引用的类。
但是,仅按类导入有一个优势。如果两个包中存在同名的类,那么在引用哪个类时就会发生冲突。
一个这样的例子是java.awt.List
类和java.util.List
类。
假设我们要使用java.awt.Panel
和java.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.
【讨论】:
好点。那么编译器在用List编译代码时会报编译错误吗? 是的,编译器会告诉您名称List
不明确。
注:您仍然可以导入整个包,然后覆盖各个类的导入。换句话说,您仍然可以 import java.awt.* 然后 import java.util.List.【参考方案3】:
您选择使用的导入只会在解析类名时产生编译时差异。
因此,唯一的优点/缺点适用于可读性。
只导入您需要的最小值似乎更好,因为有人可以查看您实际使用的内容。也就是说,IDE 可能会处理这个问题,这是一个有争议的问题。
【讨论】:
【参考方案4】:在编译时执行显式导入更安全,因为不可能发生类冲突。例如
import java.sql.*;
import java.util.*;
如果您尝试使用 Date 类(即来自哪个包?),则会出现问题。
但除此之外,没有性能或内存方面的问题。这纯粹是一个编译时问题。
【讨论】:
【参考方案5】:使用“*”导入的优点是代码行数更少,打字也更少。如果您使用“哑”文本编辑器而不是 IDE 进行编码,这一点比使用省略号隐藏导入并可以半自动添加导入更为重要。
使用'*'导入的缺点是:
您偶尔会遇到导入的类名冲突;例如当某些类名用于不同包中的类并且您将它们都导入时。 您无法通过查看导入来查看类的显式依赖关系。但是,如果您的 IDE 可以通过其他方式向您显示依赖项,那么这一点就不那么重要了。【讨论】:
【参考方案6】:任何体面的 IDE 都会为您添加导入语句,此外还有更多。如果这对您来说是个问题,请获得更好的 IDE。
IntelliJ 做到了; Eclipse 也是如此。我自己不使用 NetBeans,但我敢打赌它会。
【讨论】:
以上是关于Java中的类导入和包导入有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章