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,编译器无法从库中区分你的XX

如果你只从库中导入你真正需要的类,那么你就不会遇到这个问题,因为你不会自动从库的 1.1 版导入X

【讨论】:

【参考方案2】:

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

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.

【讨论】:

好点。那么编译器在用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中的类导入和包导入有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Java类库和包有啥区别?

怎么样使用java包里面提供的类?自己定义的类名可以和包中的类名一样吗?怎么知道使用了java包里面的类?

导入整个模块或导入某个功能有啥区别? [复制]

包和导入有啥区别? [复制]

Java中的单例模式和静态类有啥区别? [复制]

导入语句中的“show”和“as”有啥区别?