首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java中空值引用上的静态字段

Java中空值引用上的静态字段
EN

Stack Overflow用户
提问于 2012-07-20 21:03:03
回答 3查看 8.5K关注 0票数 119

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

代码语言:javascript
复制
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。这段代码是如何工作的?

EN

回答 3

Stack Overflow用户

发布于 2012-07-20 21:05:32

因为,正如您所说,静态字段并不与实例相关联。

从实例引用访问静态字段的能力(就像您正在做的那样)仅仅是语法上的糖,没有额外的含义。

您的代码将编译为

代码语言:javascript
复制
main.getNull(); 
Main.value
票数 19
EN

Stack Overflow用户

发布于 2012-12-20 17:52:52

当您在编译时访问带有对象的静态变量或方法时,它会转换为类名。例如:

代码语言:javascript
复制
Main main = null;
System.out.println(main.value);

它将打印静态变量value的值,因为在编译时它将被转换为

代码语言:javascript
复制
System.out.println(Main.value);

证明:

下载反编译器并将您的.class文件反编译为.java文件,您可以看到所有静态方法或变量引用的对象名称都会自动替换为类名称。

票数 3
EN

Stack Overflow用户

发布于 2012-12-26 22:39:49

静态变量和方法始终属于类。因此,当我们创建任何对象时,只有非静态变量和方法与对象一起进入堆,而静态与类一起驻留在方法区域中。这就是为什么当我们试图访问静态变量或方法时,它会转换为类名、点变量或方法名。

请参考下面的链接了解更多详细信息。

http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11579953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档