null对象访问static属性或方法

一道非常有趣的基础题 , 如下所示 , main方法正常运行还是报空指针异常呢

public class XUtil {
    public static int num = 10;
    
	public static void sayHello() {
        System.out.println("Hello");
    }
}

public class XDemo {

    public static void main(String[] args) throws Exception {
        XUtil entity = new XUtil();
        System.out.println(entity.num);
        entity.sayHello();
    }
}

答案是 , 正常输出 : 

10
Hello
这可能和我们之前所理解的有些偏差 , 用null对象调用任何属性或方法不是都会报空指针异常吗 ? 

我们来看一下XDemo编译后的class文件


很明显可以看到 , 编译期已经自动帮我们把entity换回了原本应该用的类名XUtil  . 

那为什么要帮我们做这件事呢 . 这还是static修饰符的基础知识点 . 

static表示"全局"或者"静态"的意思 , 用来修饰成员变量和成员方法和内部静态类 , 也可以形成静态static代码块 . 被static修饰的成员变量和成员方法独立于该类的任何对象 , 也就是说 , 它不依赖类特定的实例 , 被类的所有实例共享 , 在类被加载的时候(实例化之前)就被载入方法区;
通俗的来说 , 因为静态成员是属于类的而非实例对象 , 所以无论用任何实例对象去调用静态成员时 , java编译期会自动替换为类去调用(替你纠正) , 所以无论实例对象(entity)是否为null , 都不影响类访问它的静态成员 . 

关于这个问题 , 还有一篇更专业的从字节码角度上分析的文章 , 大家可以参考 : 点击查看

猜你喜欢

转载自blog.csdn.net/xingbaozhen1210/article/details/80431464
今日推荐