gpt4 book ai didi

java - 继承:对象创建

转载 作者:搜寻专家 更新时间:2023-10-30 21:39:36 24 4
gpt4 key购买 nike

假设我有这段代码:

class Animal {
int legs = 4;
int head = 1;
}

public class Dog extends Animal {
public static void main (String []args) {
Dog dog = new Dog();
}
}

我知道 super() 隐式地放在无参数构造函数的第一行,所以我知道 Animal 构造函数将被执行,所以Animal 的实例变量将被设置。

为此,我想了解,一旦这些变量被 super 构造函数(Animal)初始化,这些实例变量是否将保留在 Animal 对象中或复制到子类()。

在第一种情况下,Animal 对象将由 super(); 隐式实例化,每当实例 Dog 需要访问一个对象时这些变量将完成访问实例Animal(在后台创建)中保存的变量。或者第二种情况,如果将临时创建对象 Animal,则将所有实例变量(在 Animal 中)复制到 Dog 实例,然后删除 Animal 的实例临时创建。

我个人认为,例如 Dog 对象将直接链接到 Animal 对象,后者直接连接到对象。

是这样的吗?

最佳答案

只有一个对象,它立即(从一开始就是)一个Dog 实例。它具有 Dog 的所有字段(您这里没有) Animal 的所有字段。

最初,所有变量都将设置为其默认值(0、null 等)。然后当你到达每个类的构造函数体时(在调用父类(super class)构造函数之后),实例变量初始化器被执行,然后该类的构造函数体被执行。

不需要复制,因为只有一个对象。因此,例如,如果您要编写一个 Animal 构造函数,如下所示:

public Animal() {
System.out.println(this.getClass());
}

... 它会打印出 Dog,因为该对象已经是一个 Dog,即使它的 Dog 构造函数没有尚未执行。

关于java - 继承:对象创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15177501/

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