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之间没有区别,两者都是同一个。 所以我真的不认为这里需要使用第一种导入。