Java 中的静态导入语句

普通的导入语句从包中导入类,因此可以在不引用包的情况下使用它们。 同样,静态导入语句从类中导入静态成员,并允许在不使用类引用的情况下使用它们。

静态导入语句也有两种形式:单静态导入和按需静态导入。 单静态导入语句从类型中导入一个静态成员。 静态按需导入语句将导入类型的所有静态成员。 静态导入语句的一般语法如下:

//Single-static-import declaration:

import static <<package name>>.<<type name>>.<<static member name>>;

//Static-import-on-demand declaration:

import static <<package name>>.<<type name>>.*;

静态导入示例

例如,您记得使用System.out.println()方法在标准输出中打印消息。 Systemjava.lang包中的类,具有一个名为out的静态变量。 当您使用System.out时,您是在System类之外引用该静态变量。 您可以使用静态导入语句从System类中导入out静态变量,如下所示:

import static java.lang.System.out;

您的代码现在可以在程序中使用名称out来表示System.out。 编译器将使用静态导入语句将名称out解析为System.out

public class StaticImportTest {
        public static void main(String[] args) {
                out.println("Hello static import!");
        }
}

静态导入规则

以下是有关静态导入语句的一些重要规则。

1)如果导入了两个具有相同简单名称的静态成员,一个使用单静态导入语句,另一个使用静态按需导入语句,则使用单静态导入语句导入的成员优先。

假设有两个类别,package1.Class1package2.Class2。 这两个类都有一个称为methodA的静态方法。 以下代码将使用package1.Class1.methodA()方法,因为它是使用单静态导入语句导入的:

import static package1.Class1.methodA; // Imports Class1.methodA() method
import static package2.Class2.*;  // Imports Class2.methodA() method too

public class Test {
        public static void main(String[] args) {
                methodA();   // Class1.methodA() will be called
        }
}

2)不允许使用单静态导入语句导入具有相同简单名称的两个静态成员。 以下静态导入语句会产生错误,因为它们都使用相同的简单名称methodA导入静态成员:

import static package1.Class1.methodA;
import static package1.Class2.methodA; // An error

3)如果使用单静态导入语句导入静态成员,并且在同一类中存在具有相同名称的静态成员,则使用该类中的静态成员。

// A.java
package package1;

public class A {
        public static void test() {
                System.out.println("package1.A.test()");
        }
}

// Test.java
package package2;

import static package1.A.test;

public class Test {
        public static void main(String[] args) {
                test(); // Will use package2.Test.test() method, not package1.A.test() method
        }

        public static void test() {
                System.out.println("package2.Test.test()");
        }
}

Output:

package2.Test.test()

静态导入似乎可以帮助您使用静态成员的简单名称来简化程序的编写和读取。 有时,静态导入可能会在程序中引入一些细微的错误,这些错误可能很难调试。 建议您完全不使用静态导入,或仅在极少数情况下使用静态导入。