gpt4 book ai didi

java - 创建新的子类对象时是否存在父类(super class)实例?

转载 作者:行者123 更新时间:2023-12-05 09:23:06 24 4
gpt4 key购买 nike

JVM 是否在创建新的子类对象时创建父类(super class)实例?在下面的示例中,为什么 super.setName("Buddy") 会成功?创建 new Dog() 后是否有 Pet 的实例?

public class MainDemo {
public static void main(String[] args) {
Pet pet = new Dog();
System.out.println(pet.getName());//it will print Buddy
}
}
public class Pet {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Dog extends Pet {
public Dog() {
super.setName("Buddy");
}
}

我像下面这样更改了 Dog 和 Pet 的构造函数

public Pet() {
System.out.println("this is Pet's constructor");
}
public Dog() {
super.setName("Buddy");
System.out.println("this is Dog's constructor");
}

控制台的结果是

this is Pet's constructor
this is Dog's constructor
Buddy

看起来jvm创建了一个Pet?

我再次将代码添加到 Pet 和 Dog 中,如下所示

System.out.println(this.getClass().getName()+".hashCode="+this.hashCode());

结果是

this is Pet's constructor
com.bt.java.project.Dog.hashCode=27189676
this is Dog's constructor
com.bt.java.project.Dog.hashCode=27189676
Buddy

他们的hashCode是一样的,是不是只有一个实例?

最佳答案

当你执行

new Dog()

只有 一个 对象是物理创建的,即 Dog 类的一个实例。然而,这个实例还包含所有必要的信息,因此它可以用作 Pet。它继承了 Pet 中包含的所有非私有(private)字段/方法,但也可以添加特定于狗的其他字段/方法。出于这个原因,一个对象也被称为它所有父类(super class)的实例,但这并没有改变只有一个对象被创建的事实(我认为这是你的问题,从根本上说)。

你应该这样想一个 Dog 对象:

+---------------+|  +---------+  ||  | Pet     |  ||  | fields  |  ||  | and     |  ||  | methods |  ||  +---------+  ||               ||  Dog          ||  fields       ||  and          ||  methods      |+---------------+

它仍然是一个对象,但您可以将它视为宠物,只需考虑最里面的Pet 上图的区域。

关于java - 创建新的子类对象时是否存在父类(super class)实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24245753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com