gpt4 book ai didi

java - 派生类可以调用它们的抽象父类的构造函数,调用它们尚未实现的方法吗?

转载 作者:行者123 更新时间:2023-12-03 20:47:28 24 4
gpt4 key购买 nike

我有一个 Java 问题。我想创建一个具有一些抽象方法的抽象类。在抽象类构造函数中,我想调用这些抽象方法。

扩展这个抽象类的类必须实现抽象方法,他们唯一要做的就是在自己的构造函数中调用抽象类构造函数(使用 super() 关键字)。

如果这听起来有点复杂,这是我想做的一个例子(如果有任何语法错误,我很抱歉,我在记事本中写了这个例子):

public abstract class DarthVader{

public DarthVader() {
System.out.println("Luke, I am your father!");

method1();
method2();
}

public abstract void method1();
public abstract void method2();
}

...

public class Jedi extends DarthVader {

public Jedi() {
super();
}

public void method1() {
System.out.println("I am a true jedi");
}

public void method2() {
System.out.println("Prepare to die!");
}
}

...

public class Sith extends DarthVader  {

public Sith() {
super();
}

public void method1() {
System.out.println("Hello dad");
}

public void method2() {
System.out.println("Sith Lords Rule!");
}
}

所以,我希望子类的唯一责任是:

1)抽象方法的实现

2) 调用 super 构造器(我不希望他们必须决定应该调用什么方法)

这可能吗?

  • PS:如果标题没有反射(reflect)我想问的问题,请随意推荐其他标题!

最佳答案

这是允许的,但它有严重的危险,一些编译器会给你一个警告。它与抽象的父类(super class)或抽象的方法无关。它与基类调用非 final方法有关。

考虑以下几点:

class Base {
SomeObject s;
Base() { s = new SomeObject(); foo(); }
void foo() { s.someMethod(); }
}

class Der {
SomeOtherObject o;
Der() { super(); o = new new SomeOtherObject();}
@Override foo() { o.someOtherMethod(); }
}

创建 Der 时会发生什么?

  1. Der() 被调用
  2. Base() 被调用
  3. Base.s 已初始化
  4. foo() 被调用
  5. 调用被发送到 Der.foo()
  6. Der.foo 调用 o.someOtherMethod

此时 Der.onull 并且你得到一个 NullPointerException

(构造函数中的虚拟成员调用)[构造函数中的虚拟成员调用对主题有很好的解释。它适用于 C#,但同样适用于 java

关于java - 派生类可以调用它们的抽象父类的构造函数,调用它们尚未实现的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22799389/

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