java - 为什么引用在内存中有大小,即使它没有引用此代码示例中的对象?
问题描述
在变量“名称”上的动物类 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 对象大小变得等于动物对象大小。
解决方案
问题是您使用了不正确的假设。指某东西的用途
System.out.println(ObjectSizeCalculator.getObjectSize(this.name));
在您的构造函数中不会获取引用的大小this.name
,而是获取引用的对象的大小this.name
。在您的代码中给出this.name
is null
,返回的大小是0
。
给定Animal
具有 1 个字段 ( name
) 的实例,以及Dog
具有两个字段 ( name
、继承自Animal
和dogName
) 的实例,Dog
显然 的实例需要大于 的实例Animal
。