class Test {
public static String foo() {
return "called";
}
}
public static void main(String[] args) {
Test obj = null;
System.out.println(obj.foo()); // 正常运行
}
解析
因为 jvm 内存里有栈区、堆区,
栈区主要用来存放基础类型数据和局部变量,堆区主要存放 new 出来的对象
,在堆区又有一个叫做方法区的内存区域用来存放常量、static 变量和 static 方法、还有类的信息,static 的变量和方法不依赖对象,即使对象没有创建,在类加载的时候已经存在信息了(Test 在声明时就被加载了),jvm 识别出是 static 方法就直接调用了在方法区内存里的方法,没有报空指针异常。