gpt4 book ai didi

java - 在 Java 的父类(super class)构造函数中调用抽象方法

转载 作者:搜寻专家 更新时间:2023-11-01 02:29:18 24 4
gpt4 key购买 nike

既然子类还没有构造,那么在父类的构造函数中调用抽象方法是不是不安全?

但是,如果方法的行为不依赖于子类的构造,例如只是返回一个关于子类的常量,它仍然不安全还是可以可靠地工作?

此外,如果可行,如果我不想将父类(super class)抽象化怎么办?

更新:关于最后一个问题

public class SuperClass {
public SuperClass() {
System.out.println(getValue());
}

public String getValue() {
return "superclass";
}

public static void main(String[] args) {
new SubClass();
}

}


class SubClass extends SuperClass {
public SubClass() {
super(); // Comment out this or not will not affect the result
}

public String getValue() {
return "subclass";
}
}

我写了一个测试,结果是:subclass感谢@Tim Pote 的示例。

最佳答案

它通常(但不一定)被认为是不安全的。如您所说,父类(super class)可能未完全构建,因此无法处理子类可能在其重写方法中进行的所有调用。

但是,如果所有 子类只返回一个不依赖于任何其他方法的常量,那么它应该没问题。唯一的缺点是您不能保证子类会以适当的方式覆盖该方法。

关于您的最后一个问题:这不是抽象父类(super class)与具体父类(super class)的问题。这是在构造函数中调用可覆盖方法的问题。抽象与具体无关紧要。


根据 OP 的评论进行编辑

我不确定你所说的“多态性”是什么意思。调用虚方法总是调用最底层的实现。调用父类(super class)实现的唯一时间是通过 super 关键字。例如:

public class SuperClass {
public SuperClass() {
System.out.println(getValue());
}

public String getValue() {
return "superclass";
}

public static void main(String[] args) {
new SubClass();
}

public static class SubClass extends SuperClass {
public String getValue() {
return "subclass";
}
}
}

打印子类

还有这个:

public class SuperClass {
public SuperClass() {
System.out.println(getValue());
}

public String getValue() {
return "superclass";
}

public static void main(String[] args) {
new SubClass();
}

public static class SubClass extends SuperClass {
public String getValue() {
return super.getValue() + " subclass";
}
}
}

打印父类(super class)子类

关于java - 在 Java 的父类(super class)构造函数中调用抽象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13391140/

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