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

完整包导入。*和指定类导入java之间的差异?,java,Java,可能重复: 例1 例2 在调整2)而不是1)时是否有任何效率增益(即使是最微小的)?java如何在内部进行包的引用 当编译器第一次遇到JFrame这个词时,我认为它应该在完整的swing中搜索JFrame.*包,如果是1)…否则,如果是在案例2中),它可能会通过一些索引直接获得类,或者可能是键值散列?那么,为什么这不被认为是一种效率增益,即使它很小?(如果我对内部构件的假设是错误的,请纠正我) 编辑: 对不起,重复了。。答案在第一个将在编译时加载包中的所有类 Ex : 1 import ja

可能重复:

例1

例2

在调整2)而不是1)时是否有任何效率增益(即使是最微小的)?java如何在内部进行包的引用

当编译器第一次遇到JFrame这个词时,我认为它应该在完整的swing中搜索JFrame.*包,如果是1)…否则,如果是在案例2中),它可能会通过一些索引直接获得类,或者可能是键值散列?那么,为什么这不被认为是一种效率增益,即使它很小?(如果我对内部构件的假设是错误的,请纠正我)

编辑:


对不起,重复了。。答案在

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

Ex : 1

import javax.swing.*

JFrame f = new JFrame()
Ex: 2

import javax.swing.JFrame

JFrame f = new JFrame()
第二个将只加载编译时指定的类

Ex : 1

import javax.swing.*

JFrame f = new JFrame()
Ex: 2

import javax.swing.JFrame

JFrame f = new JFrame()
如果使用第一种方法,将增加编译时间

import javax.swing.*
导入此包中的所有类

import javax.swing.JFrame
仅导入
JFrame

我建议导入具体类。
问候

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

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


另一个问题是,您可能会遇到命名冲突。例如,如果您执行两次导入
import com.abc.*
import com.xyz.*
。现在,假设两个包都包含一个名为
SomeClass
的类。然后,它将编译器置于一个不明确的位置,即导入哪个
SomeClass
,从而导致编译时错误。

星型符号只是一种方便,因此作为程序员,您不必编写大量的导入语句。星形符号将包括特定包的所有类作为编译候选


请注意,在大多数情况下,最好是具体的,因为它将清楚地表达您的意图。此外,现代IDE将为您完成繁琐的导入语句。因此,在某种程度上,你可以认为星符号是相当过时的。

< P>除了EX.2更明确,更清楚,它也更稳定/兼容。

例如考虑

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

...

List list;
在预收款日。如果使用具有集合的jdk版本运行相同的代码,编译器会抱怨,因为它不知道要使用哪个列表


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

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

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


类型Import on Demand(例如Import javax.swing.*)会使包javax.swing中声明的所有公共类型的简单名称在编译单元的类和接口声明中可用。

以及许多答案中的一个,因此它会使本地名称空间变得混乱()。这应该不会影响性能(可能会扩大编译器搜索所需的命名空间,因此编译可能需要稍长的时间)。这只是为了方便。我可能不正确,但我相信这只会将名称导入到您的命名空间中。编译器将此用于生成时名称解析。在运行时,完整的类名将包含在
.class
文件中,并且仅适用于实际使用的类。因此,虽然在软件维护首选项方面存在问题,以及明显的名称空间“混乱”,但它应该不会对最终的二进制文件产生影响。我不认为这会对性能产生任何影响。我还认为编译时间有点增加,但是,使用javax.swing.JFrame或javax.swing.*(以及其他几个通配符导入)进行编译测试时,我无法获得任何具有统计意义的数据。