一.什么是静态导入
- 如果要使用静态成员(方法和变量)我们必须给出提供这个静态成员的类。
- 使用静态导入可以使被导入类的静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名。
二.静态导入的语法
1.精确导入方式:import static 包名.类或接口名.静态成员名;
例如:
//精确的导入Math.sin和Math.PI
import static java.lang.Math.sin;
import static java.lang.Math.PI;
public class StaticImportSampleA {
public static void main(String[] args) {
System.out.println(sin(PI/2));//输出“1.0”
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
2.按需导入的方式:import static 包名.类或接口名.*;
注意:这种方式只是指出遇到来历不明的成员时,可以到这个类或接口里来查找,并不是把这个类或接口里的所有静态成员全部导入。
例如:
//声明遇到来历不明的成员时到java.lang.Math中去寻找
import static java.lang.Math.*;
public class StaticImportSampleB {
public static void main(String[] args) {
System.out.println(sin(PI/2));//输出“1.0”
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
三.静态导入的一些细节
- 可以静态导入的东西:变量、常量、方法和内部类都可以导入
- static import不能突破Java语言中原有的访问控制机制的限制,不过也并不在这方面增加新的约束。原来有权限访问的静态成员,都可以被导入和使用;而原来无权限访问的静态成员,用了这个方法之后也仍然是不能访问。
- 导入之间的冲突问题:进行static import的时候,可能会出现“两个语句导入同名的静态成员”的情况。在这种时候,J2SE 1.5会这样来加以处理:
-如果两个语句都是精确导入的形式,或者都是按需导入的形式,那么会造成编译错误。
-如果一个语句采用精确导入的形式,一个采用按需导入的形式,那么采用精确导入的形式的一个有效。
注意:如果两个同名的静态成员一个是属性,而另一个是方法,那么因为使用时的写法有差异,不会造成任何的冲突。 - 本地和外来之间的冲突问题:有时候,导入的东西还可能和本地的东西相冲突,这种情况下的处理规则,是“本地优先”。
- static import的负面影响:在编译期间,所有因static import的存在而简化了的名字,都会被编译器打回原型。因此在性能方面,static import没有任何影响。但是名字简化却可能造成一些维护方面的问题。
去掉静态成员前面的类型名,固然有助于在频繁调用时显得简洁,但是同时也失去了关于“这个东西在哪里定义”的提示信息,增加了阅读理解的麻烦。如果导入的来源很著名(比如java.lang.Math),或者来源的总数比较少,这个问题并不严重;但是在不属于这两种的情况下,这就不是基本可以忽略的问题了。