默认是否使用抽象超类构造方法?能否实现如下Java代码逻辑?
嘿,我来帮你理清这两个Java抽象类相关的问题:
问题1:默认情况下是否会调用抽象超类的构造方法?
当然会,不过得分情况说:
- 不管超类是不是抽象类,只要子类的构造方法没有显式调用超类的某个构造方法,Java编译器都会自动在子类构造方法的第一行插入对超类无参构造方法的调用,也就是
super(); - 但如果你的抽象超类没有定义无参构造方法(比如你的例子里只写了带
Entity参数的构造),那编译器就会直接报错——因为它找不到能自动调用的无参构造。这时候子类必须显式调用超类的带参构造方法,否则根本过不了编译这一关。
问题2:能否实现如下代码逻辑?
先把你的代码贴出来方便分析:
abstract class AbstractSuperClass { private Entity entity; public AbstractSuperClass(Entity entity) { this.entity = entity; } public abstract void operate(); } public class SubClass extends AbstractSuperClass { public void operate() { this.entity.doVoidMethod(); // SubClass实例中this.entity是否已定义? } } // ... 其他位置 Entity instantiatedEntity = new Entity(); SubClass instance = new SubClass(instantiatedEntity); instance.operate(); // 此调用是否可行?
直接按你现在的写法是不行的,有两个关键问题:
- 构造方法的问题:
AbstractSuperClass只有带参数的构造,SubClass没有显式调用super(instantiatedEntity),编译器会尝试自动插入super(),但超类没有无参构造,直接编译报错。 - 成员访问权限的问题:超类的
entity是private修饰的,子类根本无法直接访问this.entity,这也会导致编译错误。
不过只要做两处修改,就能实现你想要的逻辑:
abstract class AbstractSuperClass { private Entity entity; public AbstractSuperClass(Entity entity) { this.entity = entity; } // 给子类提供获取entity的getter方法 public Entity getEntity() { return entity; } public abstract void operate(); } public class SubClass extends AbstractSuperClass { // 显式调用超类的带参构造,把传入的Entity传递给父类 public SubClass(Entity entity) { super(entity); } public void operate() { // 通过getter拿到entity,再调用方法 getEntity().doVoidMethod(); } } // ... 其他位置 Entity instantiatedEntity = new Entity(); SubClass instance = new SubClass(instantiatedEntity); instance.operate(); // 现在这个调用完全可行!
修改后解释:
- 当你创建
SubClass实例时,传入的instantiatedEntity会通过super(entity)传递给抽象超类的构造方法,完成entity成员的初始化 - 子类通过超类提供的
getEntity()方法拿到已经初始化的Entity实例,自然就能调用它的doVoidMethod()了
内容的提问来源于stack exchange,提问作者user3310334
相关产品推荐
相关产品推荐

