首页 > 解决方案 > 为什么引用在内存中有大小,即使它没有引用此代码示例中的对象?

问题描述

在变量“名称”上的动物类 getObjectSize 中返回 0

class Animal {

    String name;

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

这里在变量“dogName”上的 Dog getObjectSize 类中返回 0

class Dog extends Animal{
    String dogName;

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

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

在类 Main getObjectSize on Animal 对象返回 16,但 getObjectSize on Dog 对象返回 24,但我认为它应该返回 16,就像动物对象一样

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,而Animal类中的名称引用大小也等于0,那么为什么在创建Dog的新对象后它的大小大于动物对象的大小?

当我从类 dog 中删除 (String dogName) 时,现在 Dog 对象大小变得等于动物对象大小。

标签: javaoop

解决方案


问题是您使用了不正确的假设。指某东西的用途

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

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

给定Animal具有 1 个字段 ( name) 的实例,以及Dog具有两个字段 ( name、继承自AnimaldogName) 的实例,Dog显然 的实例需要大于 的实例Animal


推荐阅读