static: 可以修饰变量,方法,静态块,静态内部类,静态导包。
静态变量:类变量,即该变量属于类本身,所有实例对象共享,可通过 类.变量 的方式直接获取,无需创建实例对象。
静态方法:该方法属于类本身,也不需要实例对象就可获取,所有实例对象共享。
静态代码块:属于类本身,类加载时初始。
静态内部类:static修饰类只有静态内部类这种情况,
静态导包:这个是JDK1.5之后的新特性,import static这两个关键字连用可以指定导入某个类中的指定静态资源。
注意:因为类加载机制的原因,静态方法不能访问非静态资源,因为静态方法在类加载时初始化,而非静态资源则是在创建对象实例时才初始化,这个顺序导致静态方法不能访问非静态资源,而非静态则可以调用静态的。
下面来个例子:
import static java.lang.System.out;
public class StaticDemo {
//成员变量
private String name;
//静态变量
private static int age = 25;
public static void getField(){
System.out.println("age:" + age);
//静态方法中用成员变量会报:不能调用非静态属性的
//System.out.println("name:" + name);
}
static {
System.out.println("静态代码块");
}
static class internalClass{
public void show(){
System.out.println("静态内部类方法 show");
}
}
public static void main(String [] args){
//因为已经静态导包,所以可以这样用
out.println(123);
System.out.println("类.静态变量方式调用:"+ StaticDemo.age);
System.out.println("类.静态方法方式调用:");
StaticDemo.getField();
StaticDemo.internalClass obj = new internalClass();
System.out.println("内部类show方法:");
obj.show();
}
}
输出:
静态代码块
123
类.静态变量方式调用:25
类.静态方法方式调用:
age:25
内部类show方法:
静态内部类方法 show