gpt4 book ai didi

java - "extends"实际上是做什么的?

转载 作者:行者123 更新时间:2023-11-29 04:08:25 25 4
gpt4 key购买 nike

目前正在研究“类抽象”和“扩展”的概念,一直在疑惑:
“如果我在我的抽象类中声明了一个参数化的构造函数,为什么在另一个类上的扩展不能工作,除非我用 super 关键字声明自己的构造函数调用抽象类的构造函数的参数?”

我理解扩展将前一个抽象类实例化为扩展类并尝试调用默认构造函数这一事实,但一直想知道为什么它会给出错误。

是因为构造函数被参数化了还是仅仅因为空构造函数不存在?

extends 关键字是否调用了与此类似的内容?

Object myClass = new AbstractClass();

缺少的参数是它给出错误的原因,所以类似这样的东西是正确的

Object myClass = new AbstractClass(int foo,float boo);

如果是这样的话,super 关键字是否本质上,如果你允许我使用这个术语,将括号中给出的参数“放入”构造函数“内部”?

如果不是这样,我哪里错了?它实际上是如何工作的?

最佳答案

在这种情况下,您应该想到 extends 关键字只是表示一个类是另一个类的子类,除此之外什么都不做。并且存在管理子类和父类(super class)应如何工作的规则。

构造子类时,必须先构造它的父类(super class)。例如,要创建一个Bird,您必须先创建一个Animal。这是有道理的,不是吗?在代码中演示这一点:

class Animal {
public Animal() {
System.out.println("Animal");
}
}

class Bird extends Animal {
public Bird() {
System.out.println("Bird");
}
}

执行 new Bird() 将首先打印 Animal 然后是 Bird,因为 Animal 的构造函数首先被调用,然后是 Bird 构造函数。所以实际上,Bird 构造函数隐式调用父类(super class)的构造函数。这可以写成:

public Bird() {
super();
System.out.println("Bird");
}

现在如果父类(super class)没有无参数构造函数会发生什么?假设 Animal 的构造函数现在将 String name 作为参数。您仍然需要先调用父类(super class)的构造函数,但是 super() 将不起作用,因为 super() 需要一个字符串参数!

因此,编译器会报错。这可以通过调用 super() 显式带参数来解决。

关于java - "extends"实际上是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56699570/

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