在Java中,import
声明有两种有效形式:
import java.lang.Math;
import java.lang.Math.*;
在后者中,使用通配符。此表单称为按需导入类型声明,但它与前者有何不同?它是否还导入java.lang.Math
如果Math
是一个类型(例如,一个类) - 会导入所有内部类吗?
答案 0 :(得分:5)
注意:另一种不太常见的导入形式允许您导入封闭类的公共嵌套类。例如,如果graphics.Rectangle类包含有用的嵌套类,例如Rectangle.DoubleWide和Rectangle.Square,则可以使用以下两个语句导入Rectangle及其嵌套类。
import graphics.Rectangle; import graphics.Rectangle.*;
请注意,第二个import语句不会导入Rectangle。
因此导入import java.lang.Math.*;
不会导入Math
类。
注意:您可能还想查看Why is using a wild card with a Java import statement bad?
答案 1 :(得分:3)
import java.lang.Math.*;
这将导入Math
包中java.lang
类中声明的所有嵌套类。可以在没有外部类的情况下给出对嵌套类的引用(例如Foo
为java.lang.Math.Foo
)。
import java.lang.Math;
这将导入Math
包中的java.lang
类。必须使用外部类(例如,Math.Foo
)来提供对嵌套类的引用。
答案 2 :(得分:2)
仅导入立即嵌套的类型。声明不是递归的。
这适用于导入内部类的类型。这也适用于静态导入(用于导入方法)。
import static a.b.c.FooBar.*;
答案 3 :(得分:2)
声明
import java.util.ArrayList.*;
导入所有嵌套的ArrayList类,但不导入ArrayList本身。由于ArrayList没有任何(公共)嵌套类,因此该语句实际上什么都不做。
但是,请考虑接口Map
,它定义嵌套类Map.Entry
。如果我们写
import java.util.Map.*;
在Java文件的开头,我们可以编写Entry<A,B>
而不是Map.Entry<A,B>
来引用这个嵌套类。
如果您使用静态导入,导入类的成员通常最有意义。然后,您不会导入嵌套类,而是导入静态方法和变量。例如,
import static java.Math.*;
将从Math
类导入所有静态常量和方法。然后,您可以通过写入来使用Math
类的静态方法,例如: sin(x)
代替Math.sin(x)
。
答案 4 :(得分:1)
使用语句import java.util.ArrayList.*;
,您将导入声明为ArrayList
类的所有嵌套类。
如果您还想导入方法和const,例如声明:
import static java.lang.Math.*;
然后,您可以在代码中使用常量 PI
,而不是通过Math.PI
和方法 {{1}引用它而不是cos()
。所以,例如,你可以写:
Math.cos()
答案 5 :(得分:0)
基本上Math是最后一个类,它没有更多的子类。 import java.lang.Math.*
和import java.lang.Math
之间没有区别,两者都是同一个。所以我真的不认为这里需要使用第一种导入。