Java中this()构造器调用失效问题求助
问题原因与解决方案
你代码的核心问题是Java规定构造器中调用同类其他构造器的this()必须是构造器的第一条语句,不能放在if/else分支里面,这是语法硬性要求,编译器直接会报错,导致功能无法正常运行。
修正后的代码示例
方案1:先确定参数再调用this()
把条件判断移到this()调用之前,先算出对应职业的属性值,再用this()传参:
public class Jugador{ //成员变量 private String nombre; private String clase; private int vida; private int ad; private int ap; private int def; private int mr; //私有构造器 private Jugador(String nombre, String clase, int vida, int ad, int ap, int def, int mr){ this.nombre = nombre; // 外部构造器已做职业校验,这里的判断可保留也可直接赋值 if (clase.equals("hunter") || clase.equals("warrior") || clase.equals("assasin") || clase.equals("tank")){ this.clase = clase; } else{ this.clase = "normal"; } this.vida = vida; this.ad = ad; this.ap = ap; this.def = def; this.mr = mr; } public Jugador(String nombre, String clase){ // 先根据职业初始化属性参数 int vida = 80, ad = 80, ap = 0, def = 80, mr = 0; // 转小写避免大小写拼写错误 switch(clase.toLowerCase()){ case "hunter": vida = 120; ad = 50; def =40; break; case "warrior": vida =100; ad=70; def=80; break; case "assasin": vida=60; ad=120; def=20; break; case "tank": vida=200; ad=20; def=80; break; default: clase = "normal"; // 非法职业直接设为normal break; } // 必须是构造器第一条执行语句(变量初始化不属于执行语句) this(nombre, clase, vida, ad, ap, def, mr); } }
方案2:用静态工厂方法(更灵活)
如果觉得构造器的限制太麻烦,也可以用静态方法创建对象,避开this()的语法限制:
public class Jugador{ //成员变量 private String nombre; private String clase; private int vida; private int ad; private int ap; private int def; private int mr; //私有构造器 private Jugador(String nombre, String clase, int vida, int ad, int ap, int def, int mr){ this.nombre = nombre; this.clase = clase; this.vida = vida; this.ad = ad; this.ap = ap; this.def = def; this.mr = mr; } // 静态工厂方法,负责处理职业参数 public static Jugador crearJugador(String nombre, String clase){ String validClase = clase; int vida, ad, ap=0, def, mr=0; switch(clase.toLowerCase()){ case "hunter": vida=120; ad=50; def=40; break; case "warrior": vida=100; ad=70; def=80; break; case "assasin": vida=60; ad=120; def=20; break; case "tank": vida=200; ad=20; def=80; break; default: validClase = "normal"; vida=80; ad=80; def=80; break; } return new Jugador(nombre, validClase, vida, ad, ap, def, mr); } }
使用时直接调用Jugador.crearJugador("张三", "hunter")即可。
额外优化建议
- 把职业定义成枚举类型,比如
enum Clase {HUNTER, WARRIOR, ASSASIN, TANK, NORMAL},避免字符串拼写错误,提升类型安全性。 - 私有构造器里的clase判断可以去掉,因为外部已经做了合法性校验,直接赋值即可。
内容的提问来源于stack exchange,提问作者Andres Ordonez
相关产品推荐
相关产品推荐

