在Java中,以static修饰的成员变量和方法成为类成员变量和类方法,其属于整个类而不是属于单个对象。
特别地,类成员是不能访问实例成员的。
但是在Java中,允许用Java类的实例–对象来调用类变量,这其实是不符合内部实际运行结果的。
如下代码:
public class NullAccessStatic {
private static void test() {
System.out.println("static修饰的类方法");
}
private void tests() {
System.out.println("实例变量的方法");
}
public static void main(String[] args) {
//定义一个NullAccessStatic变量,其值为null
NullAccessStatic nas = null;
NullAccessStatic two = new NullAccessStatic();
two .test();
two.tests();
nas.test();
nas.tests();
}
}
}
在上面的代码中,定义了一个null对象,其在内存中是没有存在空间的,但它可以正常调用类方法,说明其实它是委托给该类(NullAccessStatic)来访问类成员,
然而当其访问实例变量时,编译器就会报错。运行结果如下:
static修饰的类方法
实例变量的方法
static修饰的类方法
Exception in thread "main" java.lang.NullPointerException
at crazy.NullAccessStatic.main(NullAccessStatic.java:17)