Java子类打印参数默认值而非赋值值,请求排查错误原因
排查Java继承中输出0和null的问题
嘿,这个问题我之前帮不少开发者踩过坑,大概率是构造方法调用逻辑或者成员变量隐藏导致的,咱们一步步拆解:
最常见的原因:子类未显式调用父类带参构造
假设你的代码结构大概是这样(我还原了常见错误场景):
class Animal { int age; String sound; // 父类的带参构造,用来初始化成员变量 public Animal(int age, String sound) { this.age = age; this.sound = sound; } // 如果你手动加了无参构造(或者父类本来就有) public Animal() { // 这里age默认是0,sound默认是null } } class Lion extends Animal { public Lion(int age, String sound) { // 注意!这里编译器会自动插入一行`super()`,调用父类的无参构造 // 你传入的30和"roars"根本没传到父类的带参构造里 } public void printInfo() { System.out.println(age); System.out.println(sound); } } // 测试代码 public class Main { public static void main(String[] args) { Lion lion = new Lion(30, "roars"); lion.printInfo(); // 输出0和null } }
问题根源
Java规定:子类构造方法如果没有显式调用super(参数)或者this(参数),编译器会自动在构造方法的第一行插入super()(调用父类的无参构造)。这时候父类的成员变量会被初始化为默认值(int类型默认0,引用类型默认null),你传入的参数根本没被用来初始化父类的成员。
解决方法
在子类构造方法的第一行,显式调用父类的带参构造,把参数传递进去:
class Lion extends Animal { public Lion(int age, String sound) { super(age, sound); // 把传入的参数传给父类构造,完成初始化 } }
第二种可能:子类定义了同名成员变量,导致隐藏
如果你在子类里自己定义了和父类同名的age或sound,就会隐藏父类的成员变量,比如:
class Lion extends Animal { int age; // 子类自己的age,隐藏了父类的age String sound; // 同理隐藏父类的sound public Lion(int age, String sound) { // 这里没给子类的age和sound赋值,所以它们是默认值 } public void printInfo() { // 这里访问的是子类自己的成员,不是父类的 System.out.println(age); System.out.println(sound); } }
解决方法
- 如果你不需要子类自己的成员变量,直接删除子类中同名的
age和sound,继承父类的即可; - 如果确实需要子类自己的成员,就在构造方法里给它们赋值:
public Lion(int age, String sound) { this.age = age; this.sound = sound; }
你可以对照自己的代码检查这两个点,应该就能解决问题啦!
内容的提问来源于stack exchange,提问作者Nobi
相关产品推荐
相关产品推荐

