【问题标题】: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;

除了代码长度之外,以任何方式使用每种方法是否有任何特定优势?内存分配?表现?

【问题讨论】:

  • 我正要问这个。谢谢!

标签: java import


【解决方案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,但我敢打赌它会。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-01-14
            • 2020-08-10
            • 2018-06-23
            • 2016-08-08
            • 2011-12-20
            • 2019-09-21
            • 1970-01-01
            相关资源
            最近更新 更多