下面的代码,通过为null的引用调用静态方法,且并未产生异常。
public class Why {
public static void test() {
System.out.println("Passed");
}
public static void main(String[] args) {
Why NULL = null;
NULL.test();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
null并不是没有实例化,null也是一个对象,是一个只包含静态成员引用的对象
test() 是一个静态方法,调用静态方法不需要创建实例对象。静态成员应该通过类型来访问,上面对test()方法通常应该写为Why.test();Java中可以通过对象引用表达式来访问一个静态成员,但这样通常会引起误解,因为这不是访问静态成员的常见形式。
hy aNull = null;
aNull.test(); // 实际开发中不要这样写
// 调用 Why.test(), 不会抛出 NullPointerException
- 1
- 2
- 3
当通过一个对象引用访问静态成员时,访问只与所声明的引用类型相关。即:
1. 所引用对象是否为null无关紧要,因为访问静态方法不需要实例对象。
2. 如果引用不为null,运行时对象类型也无关紧要,因为静态调用不会导致动态调用分派。而是与类相关。
对于第2点的示例。
class T {
public static void p() {
System.out.println("p() in T");
}
}
class T1 extends T {
public static void p() {
System.out.println("p() in T1");
}
}
public class Main {
public static void main(String[] args) {
T t = new T1();
t.p();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
最后访问静态方法,建议使用标准写法来写,这样不容易引起误解,也便于走读维护。