gpt4 book ai didi

java - 如何打破父类(super class)构造函数链?

转载 作者:行者123 更新时间:2023-12-04 20:44:06 24 4
gpt4 key购买 nike

class Animal {
protected Animal(){
System.out.println("ANIMAL CONSTRUCTOR");
}
public void move(){
System.out.println("ANIMAL Move");
}
}

class Dog extends Animal{
public Dog(){
System.out.println("Dog Constructor");
}
public void move(){
System.out.println("Dog move");
}

}


public class Test {
public static void main(String args[]){
Dog d = new Dog();
d.move();
}
}

上面的代码产生下面的结果:

ANIMAL CONSTRUCTOR 
Dog Constructor
Dog move

似乎在创建 dog 实例时,它还默认(隐式)调用了 Animal 构造函数。

这很奇怪,因为我认为显式调用 super() 可以完成同样的工作。

有没有办法打破这个构造函数链,让我的狗实例只调用 Dog 构造函数?

如果没有,有什么理由吗?

最佳答案

It seems that when dog instance is created, it also calls Animal constructor by default (implicitly).

是的。

Which is strange because I was thinking explicitly calling super() can do the same job.

可以,是的,但如果不这样做,编译器会在子类构造函数的开头插入对 super() 的调用(不带参数)。允许您显式执行此操作的原因是您可能希望调用接受参数的父类(super class)构造函数。

Is there any way to break this constructor chain and let my dog instance only call Dog constructor?

没有。

if there is not, is there reason for it?

因为 Dog 是一个 (n) Animal,所以 Animal 类必须有机会初始化正在创建的对象的 Animal 特定功能。

考虑:

class Animal {
private Something useful;

Animal() {
this.useful = /*...something useful...*/;
}
}

class Dog extends Animal {
private String breed;

Dog(String breed) {
this.breed = breed;
}
}

当你构造一个 Dog 实例时,在内存中它看起来像这样:

+-------------+|     Dog     |+-------------+| useful: ... || breed:  ... |+-------------+

Dog 实例是 Animal 定义的内容和 Dog 定义的内容的组合。

现在,假设从未调用Animal 的构造函数:useful 有什么值(value)?正确的! null(因为我将其声明为对象类型)。但是 Animal 的代码非常明确地期望构造函数将 useful 设置为有用的东西。如果我们能以某种方式绕过 Animal 的构造函数,我们就会破坏类。

关于java - 如何打破父类(super class)构造函数链?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33740061/

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