Type-Import-on-Demand声明导入什么?

时间:2010-12-28 18:30:18

标签: java import

在Java中,import声明有两种有效形式:

  • import java.lang.Math;
  • import java.lang.Math.*;

在后者中,使用通配符。此表单称为按需导入类型声明,但它与前者有何不同?它是否还导入java.lang.Math

的子包

如果Math是一个类型(例如,一个类) - 会导入所有内部类吗?

6 个答案:

答案 0 :(得分:5)

documentation州:

  

注意:另一种不太常见的导入形式允许您导入封闭类的公共嵌套类。例如,如果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类中声明的所有嵌套类。可以在没有外部类的情况下给出对嵌套类的引用(例如Foojava.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之间没有区别,两者都是同一个。所以我真的不认为这里需要使用第一种导入。