猿问

Java中空引用上的静态字段

staticJava中的成员(static字段或static方法)与它们各自的类相关联,而不是与此类的对象相关联。以下代码尝试访问null引用上的静态字段。


public class Main

{

    private static final int value = 10;


    public Main getNull()

    {

        return null;

    }


    public static void main(String[] args)

    {

        Main main=new Main();

        System.out.println("value = "+main.getNull().value);

    }

}

尽管main.getNull()返回null,但它仍然有效并显示value = 10。此代码如何工作?


qq_笑_17
浏览 401回答 3
3回答

鸿蒙传说

该行为在Java语言规范中指定:空引用可用于访问类(静态)变量,而不会引起异常。更详细地讲,进行静态评估,例如Primary.staticField以下工作(重点是我的工作)-在您的情况下Primary = main.getNull():计算主表达式,并丢弃结果。[...]如果该字段是非空白的final字段,则结果是在类或接口中指定的类变量的值,该变量是Primary表达式的类型。[...]

回首忆惘然

正如您所说,因为静态字段不与实例关联。从实例引用访问静态字段的能力(就像您正在做的那样)仅仅是一种语法糖,没有其他意义。您的代码编译为main.getNull(); Main.value

翻阅古今

每当您在编译时使用对象访问静态变量或方法时,它都会转换为Class名称。例如:Main main = null;System.out.println(main.value);它将打印静态变量value的值,因为在编译时它将被转换为System.out.println(Main.value);证明:下载反编译器并将您的.class文件反编译为.java文件,您会看到所有静态方法或变量引用的对象名将自动替换为类名。
随时随地看视频慕课网APP

相关分类

Java
我要回答