Type-Import-on-Demand声明导入什么?
在Java中, import
声明有两种有效forms:
-
import java.lang.Math;
-
import java.lang.Math.*;
在后者中,使用通配符。 此表单称为按需导入类型声明,但它与前者有何不同? 它是否还导入java.lang.Math
的子包?
如果Math
是一个Type( 例如 ,一个类),那么它的所有内部类都会被导入吗?
仅导入立即嵌套的类型。 声明不是递归的。
这适用于导入内部类的类型。这也适用于静态导入(用于导入方法)。
import static abcFooBar.*;
文件说明:
注意:另一种不太常见的导入forms允许您导入封闭类的公共嵌套类。 例如,如果graphics.Rectangle类包含有用的嵌套类(如Rectangle.DoubleWide和Rectangle.Square),则可以使用以下两个语句导入Rectangle及其嵌套类。
import graphics.Rectangle; import graphics.Rectangle.*;
请注意,第二个import语句不会导入Rectangle。
所以导入import java.lang.Math.*;
不会导入Math
类。
注意 :您可能还想看到为什么使用带有Java import语句的通配符不好?
import java.lang.Math.*;
这将导入java.lang
包中Math
类中声明的所有嵌套类。 可以在没有外部类的情况下给出对嵌套类的引用(例如,对于java.lang.Math.Foo
Foo
)。
import java.lang.Math;
这将导入java.lang
包中的Math
类。 必须使用外部类(例如, Math.Foo
)给出对嵌套类的引用。
使用语句import java.util.ArrayList.*;
您将导入声明为ArrayList
类的所有嵌套类。
如果你还想导入方法和const,例如,声明:
import static java.lang.Math.*;
然后,您可以在代码中使用常量 PI
,而不是通过Math.PI
和方法 cos()
而不是Math.cos()
引用它。 所以,例如,您可以写:
double r = cos(PI * theta);
该声明
import java.util.ArrayList.*;
导入所有嵌套的ArrayList类,但不导入ArrayList本身。 由于ArrayList没有任何(公共)嵌套类,因此该语句实际上什么都不做。
但是,请考虑接口Map
,它定义嵌套类Map.Entry
。 如果我们写
import java.util.Map.*;
在Java文件的开头,我们可以编写Entry
而不是Map.Entry
来引用这个嵌套类。
如果使用静态导入,导入类的成员通常最有意义。 然后,您不导入嵌套类,而是导入静态方法和变量。 例如,
import static java.Math.*;
将从Math
类导入所有静态常量和方法。 然后,您可以通过写入来使用Math
类的静态方法,例如sin(x)
而不是Math.sin(x)
。
基本上Math是一个final类,它没有更多的子类。 import java.lang.Math.*
和import java.lang.Math
之间没有区别,两者都是同一个。 所以我真的不认为这里需要使用第一种导入。