Java的静态导入

Java程序不允许定义独立的函数,变量,常量(被final修饰的变量)。即使一些函数,变量,常量不依赖于任何其它的东西,也需要一个类或者接口来封装这些元素。经常使用static修饰符,定义为这个类或接口的静态成员。访问时,通过类名.元素名来访问。如果只是偶尔访问这些东西一下,这样的写法并没有什么问题;但是如果要频繁访问这些元素,这样的写法会比较麻烦。

J2SE 5.0里引入了“静态导入”机制,通过“静态导入”可以将这些元素做在当前类直接可见,使用这些静态成员无需再给出他们的类名。

精确静态导入

精确的导入一个静态成员的方法,是在源文件的开头部分(任何类或接口的定义之前),加上类似这样的声明:

import static 包名.类或接口名.静态成员名;

示例:

package org.hibiscus.demo;

public class Demo {

	public static int desc;
	
	public static int fun(int a,int b){
		return a+b;
	}
}

代码2

package org.hibiscus.main;

import static org.hibiscus.demo.Demo.*;

public class Main {

	public static void main(String[] args) {
		System.out.println(fun(1, 2));
	}
	
}

特别注意:

Java语言并不要求每个类和接口都必须属于某一个包。

但是,在J2SE1.4以后,对于不属于任何包的类和接口,是既不能用import导入它本身,也不能用import static导入它的静态成员的。

按需静态导入

静态导入可以使用*来导入

import static 包名.类或接口名.*;

这种方法只有在虚拟机遇到不明的方法调用或者变量时,才会去静态导入的类中查找。并不是把所有类中的静态变量,常量,方法全部导入当前执行的类。

静态导入的访问控制

static import不能突破Java语言中原有的访问控制机制的限制,不过也并不在这方面增加新的约束。

原来有权限访问的静态成员,都可以被导入和使用;而原来无权限访问的静态成员,用了这个方法之后也仍然是访问不能。

导入的冲突问题

不同包,不同类中,可能存在相同的静态属性或者方法,这时,如果同时静态导入相同的属性或者方法会产生静态导入的冲突。

此时,如果两个属性或者方法都是精准的静态导入或者都使用按需导入时,会造成编译错误,例如下面的错误:

The method fun(int, int) is ambiguous for the type Main

如果其中一个是精准的静态导入,另一个是按需导入,那么,精准的静态导入为有效。

有时静态导入的属性或者方法与本地的属性或者方法产生冲突,此时的处理规则为“本地优先”

静态导入的缺点

静态导入会在一定程度上降低代码的可读性,在使用不当的时候可能给维护工作带来一定的困扰。