当前位置: 首页 > 知识库问答 >
问题:

为什么即使引用不引用这个代码示例中的对象,它在内存中也有一个大小?

武彭薄
2023-03-14

这里,在类动物getObjectSize中,变量'name'返回0

class Animal {

    String name;

    public Animal() {
        System.out.println(ObjectSizeCalculator.getObjectSize(this.name));
    }
}

在类Dog getObjectSize中,变量'Dog name'返回0

class Dog extends Animal{
    String dogName;

    public Dog() {
       System.out.println(ObjectSizeCalculator.getObjectSize(this.dogName));
    }

    public void dogplay(){
        System.out.println("dog playing");
    }
}
public class Main {

    public static void main(String[] args) {

        Animal a = new Animal();
        Dog dog = new Dog();

        long objectSize = ObjectSizeCalculator.getObjectSize(a);
        long objectSize1 = ObjectSizeCalculator.getObjectSize(dog);

        System.out.println(objectSize+" "+objectSize1);

    }
}

我想到的是内存中的dogName引用大小等于0,动物类中的name引用大小也等于0,那么为什么在创建一个新的Dog对象后,它的大小比动物对象的大小大呢?

当我从类dog中移除(字符串dogName)时,现在dog对象的大小等于动物对象的大小。

共有1个答案

国胤
2023-03-14

问题是你使用了一个不正确的假设。的使用

System.out.println(ObjectSizeCalculator.getObjectSize(this.name));

构造函数中不获取引用this.name的大小,而是获取由this.name引用的对象的大小。在您的代码中,this.namenull,返回的大小是0

给定Animal的实例有一个字段(name),而Dog的实例有两个字段(name,继承自Animal,和Dogname),显然,Dog的实例需要大于Animal的实例。

 类似资料:
  • 上面的代码命名为“节点”,下面的代码命名为“测试” 我们都知道这一点。在java中,引用实例字段,在测试代码中,我们首先创建一个新的对象节点,在节点代码中,我们还创建了许多带有“new”的对象,我的问题是,在这种情况下,“this.and this”指的是什么?

  • 在这里测试一下。 然而,我想匹配一对字符后的字符,所以我想我可以简单地把它放在后面: 不幸的是,这与任何东西都不匹配。

  • 本文向大家介绍Python中对象的引用与复制代码示例,包括了Python中对象的引用与复制代码示例的使用技巧和注意事项,需要的朋友参考一下 可以说Python没有赋值,只有引用。你这样相当于创建了一个引用自身的结构,所以导致了无限循环。为了理解这个问题,有个基本概念需要搞清楚。 Python没有「变量」,我们平时所说的变量其实只是「标签」,是引用。 python中,"a=b"表示的是对象a引用对象

  • 问题内容: 作为程序员,我认为它们看起来像“地址为1a234552的java.lang.Object”或类似sin 它是否正确?因此,所有参考均固定大小吗? 问题答案: 尽管在许多VM上,引用的大小是本机指针大小(即32位JVM为32位,而64位JVM为64位),但不能保证-特别是HotSpot现在或不久将支持“ “压缩的糟糕”是在64位JVM中的32位引用。(这并不意味着每个参考都经过压缩-请阅

  • 我有一个值,我想以我自己的类型存储该值和对该值中某些内容的引用: 有时,我有一个值,我想将该值和对该值的引用存储在同一个结构中: 有时,我甚至没有引用该值,我得到了相同的错误: 在每种情况下,我都会得到一个错误,即其中一个值“活得不够长”。这个错误是什么意思?