【问题标题】:Accessing static variable from an object in memory从内存中的对象访问静态变量
【发布时间】:2016-02-11 01:47:20
【问题描述】:

最近,我了解到除了类名之外,还可以从对象访问静态变量。

我相信静态变量驻留在堆中的永久代区域,而不是堆中的对象相关区域。

另外,我认为m1.count指的是m1的内存位置,并添加一些偏移量来访问count实例变量。

在我的逻辑中,m1.count 应该吐出错误,因为在内存中 m1 对象附近没有名为 count 的实例变量。

这怎么可能?我想知道它在内存中是如何工作的。 代码如下:

class Member{
    public static int count;
}

public static void main(){    
    Member m1 = new Member();
    System.out.println(m1.count); // ???
}

【问题讨论】:

  • 你不是唯一一个。许多人认为这个“特性”是语言设计中的一个错误。

标签: java object memory static


【解决方案1】:

我相信静态变量驻留在堆中的永久代区,

此类静态字段可以位于堆上的任何位置。

我认为m1.count指的是m1的内存位置,

static 字段忽略引用。引用可以是null,代码运行良好。

我想知道它在内存中是如何工作的

类的static 字段有一个特殊对象。你可以通过堆转储来获得它。引用是偶然的。

这个

Member m1 = new Member();
System.out.println(m1.count); 

一样
Member m1 = null;
System.out.println(m1.count); 

相同
System.out.println(Member.count); 

【讨论】:

    【解决方案2】:

    我认为静态变量驻留在堆中的永久代区域,而不是堆中的对象相关区域。

    好吧,更简单地说,它们驻留在类中,而不是对象中。

    另外,我认为m1.count是指m1的内存位置,并添加一些偏移量来访问count实例变量。

    没有。它本质上是 m1.class.count,,但 m1.class 部分发生在编译时。

    在我的逻辑中,m1.count 应该会报错,因为内存中的 m1 对象附近没有名为 count 的实例变量。

    所以你的逻辑是错误的。

    【讨论】:

    • Lawrey 建议 m1 可以为空。那么,null.class 的输出是什么?
    • @PeterHwang null.class 不是正确的构造。 Member.class 仍将是 Class<Member>,而 d.class 将是 NPE。
    猜你喜欢
    • 1970-01-01
    • 2012-03-28
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    相关资源
    最近更新 更多