报错‘No default constructor available’:Java子类继承构造问题咨询
解决
No default constructor available报错问题 这个报错我太熟了!问题出在Java子类构造方法的默认行为上,咱们一步步拆解解决:
为什么会报错?
当你定义一个子类但没有显式写构造方法时,Java编译器会自动帮你生成一个默认的无参构造方法,这个自动生成的构造第一行代码会是super()——也就是调用父类的无参构造方法。
但你的父类Partida只定义了带参构造public Partida(Tablero tablero, ArrayList<Jugador> jugadores),没有提供无参构造,编译器找不到父类的无参构造可以调用,就会抛出No default constructor available这个错误。
另外还要提一句:你的子类PartidaC4里重复定义了jugadores和tablero成员变量,这会隐藏父类的同名成员,非常容易导致逻辑混乱,后续建议删掉这些重复定义,直接用父类继承来的成员就行。
两种解决方案(推荐第二种)
方案1:给父类添加无参构造方法
直接在Partida类里补充一个无参构造,记得初始化必要的成员(比如observadores必须初始化,jugadores和tablero可以根据业务需求设为空列表或默认实例):
public class Partida { private ArrayList<Jugador> jugadores; private Tablero tablero; private ArrayList<PartidaListener> observadores; // 添加无参构造 public Partida() { observadores = new ArrayList<>(); jugadores = new ArrayList<>(); // 初始化空列表 tablero = null; // 或者根据需求创建默认Tablero实例 } public Partida(Tablero tablero, ArrayList<Jugador> jugadores) { observadores = new ArrayList<>(); this.tablero = tablero; this.jugadores = jugadores; } }
方案2:子类显式定义构造方法并调用父类带参构造
这是更推荐的方案,因为父类的带参构造本来就是用来初始化核心成员的,子类应该遵循这个初始化逻辑,避免出现未正确初始化的对象:
public class PartidaC4 extends Partida { // 删掉和父类重复的jugadores、tablero,继承自父类即可 // private ArrayList<JugadorC4> jugadores; // private TableroC4 tablero; // 显式定义子类构造方法,第一行调用父类的带参构造 public PartidaC4(TableroC4 tablero, ArrayList<JugadorC4> jugadores) { // 因为TableroC4是Tablero的子类,JugadorC4是Jugador的子类,向上转型完全合法 super(tablero, jugadores); // 这里可以初始化子类自己独有的成员变量 } }
如果你的业务逻辑确实需要子类持有特定类型的jugadores和tablero,可以考虑把父类改成泛型类,这样更优雅:
// 泛型化父类 public class Partida<T extends Tablero, U extends Jugador> { private ArrayList<U> jugadores; private T tablero; private ArrayList<PartidaListener> observadores; public Partida(T tablero, ArrayList<U> jugadores) { observadores = new ArrayList<>(); this.tablero = tablero; this.jugadores = jugadores; } } // 子类继承时指定泛型类型 public class PartidaC4 extends Partida<TableroC4, JugadorC4> { public PartidaC4(TableroC4 tablero, ArrayList<JugadorC4> jugadores) { super(tablero, jugadores); // 子类独有的初始化逻辑 } }
内容的提问来源于stack exchange,提问作者Orsu
相关产品推荐
相关产品推荐

