完整包导入。*和指定类导入java之间的区别?

时间:2011-12-06 14:29:13

标签: java

  

可能重复:
  Why is using a wild card with a Java import statement bad?

实施例。 1

import javax.swing.*

JFrame f = new JFrame()

实施例。 2

import javax.swing.JFrame

JFrame f = new JFrame()

在适应2)而不是1)中是否有任何效率增益(即使是最轻微和最小)? java如何在内部引用包?

第一次编译器遇到单词JFrame时,我认为它应该在完全摆动中搜索JFrame。*包在1)的情况下..否则如果在情况2),它可能可能得到类的持有直接通过一些索引还是可能是键值散列?那么,为什么即使它很小也不被视为效率增益? (如果我对内部的假设是错误的,请纠正我)

编辑:

抱歉重复..在Why is using a wild card with a Java import statement bad?

回答

6 个答案:

答案 0 :(得分:9)

使用import javax.swing没有运行时间损失。*  并在Java中导入javax.swing.JFrame。唯一不同的是在编译时,导入包。*将搜索整个包以找到正确的类信息。

单一类型导入(例如,导入javax.swing.JFrame)增加了程序的可读性,并且将非常清楚使用了哪些类。

Type-Import-on-Demand(例如import javax.swing。*)导致在javax.swing包中声明的所有公共类型的简单名称在编译单元的类和接口声明中可用。 / p>

答案 1 :(得分:2)

第一个将在编译时加载包中的所有类

Ex : 1

import javax.swing.*

JFrame f = new JFrame()

第二个将仅加载在编译时指定的类

Ex: 2

import javax.swing.JFrame

JFrame f = new JFrame()

如果使用第一种方法

,它将增加编译时间

答案 2 :(得分:1)

星号符号仅仅是一种便利,因此您作为程序员不必编写大量的import语句。星号表示法将包括特定包的所有类作为编译候选者。

请注意,在大多数情况下,特定情况是首选,因为它会明确表达您的意图。此外,现代IDE将为您执行繁琐的导入语句。所以在某种程度上你可以认为星形符号已经过时了。

答案 3 :(得分:0)

它在编译时遇到性能问题,正如其他人所说的那样(考虑到当前计算机的处理能力,可能不是很重要)。即,导入*使编译器需要查看整个包,而导入特定的类允许编译器直接获取它。但它在运行时不会导致任何性能问题,因为编译后编译器将正确链接所有类。

它还与可读性有关。如果我们import javax.swing.*,我们将很难从包javax.swing知道正在使用哪些类。我们需要阅读该程序才能找到它。但是,如果我们导入像import javax.swing.JFrame这样的特定类,它将帮助读者理解只有外部包使用的指定类。在这里,我们知道在不读取整个程序的情况下,只使用JFrame包中的javax.swing。也就是说,通过查看导入部分,人们可以轻松找到我们程序所需的依赖项。

另一个问题是您可能会遇到命名冲突。例如,如果您执行两次导入import com.abc.*import com.xyz.*。现在,假设两个包都包含一个名为SomeClass的类。然后,它使编译器处于一个模糊的情况,即要导入哪个SomeClass,因此会导致编译时错误。

答案 4 :(得分:0)

除了Ex.2更明确,更清晰,它也更稳定/兼容。

E.g。考虑

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

...

List list;

在收集前的日子里。如果您使用具有集合的jdk版本运行相同的代码,编译器会抱怨,因为它不知道要使用哪个List。

正如其他人所说,IDE将帮助您组织导入语句。

答案 5 :(得分:-1)

是。

import javax.swing.*

导入此包中的所有类。

import javax.swing.JFrame

仅导入JFrame类。

我建议输入具体的课程。 此致!