Java调用构造方法时如何使用类属性值 面向对象继承作业问题求解
存在的问题
- 子类重复定义父类已有属性:
Cat、Bug、Bird中都重复声明了color和leg_number属性,父类Animal已经将这两个属性定义为protected,子类可以直接访问,重复声明会导致属性隐藏,出现预期外的取值问题。 - 构造方法逻辑冗余:子类构造方法先调用
super给父类属性赋值,随后又写死覆盖属性值,导致构造方法传入的参数完全无效,这也是你觉得传参没有意义的核心原因。 Bird类的move方法不符合要求:你写的move(int wing_number)是重载而非重写父类的无参move方法,且判断逻辑用的是方法传入的参数而非类自身的wing_number属性,同时所有move方法要求返回字符串,你当前实现是void类型直接打印,不满足作业要求。
修正方案
1. 代码调整
如果作业要求Cat默认是橙色、4条腿,Bug默认是绿色、16条腿,Bird默认是黄色、2条腿,不需要自定义这些属性,直接把构造方法改为无参,固定给父类传值即可:
class Animal { protected String color; protected int leg_number; public Animal(String color, int leg_number) { this.color = color; this.leg_number = leg_number; } // 父类move方法也同步改为返回String public String move() { return "I'm moving with " + leg_number + " legs!"; } } class Cat extends Animal { // 删掉重复定义的color、leg_number属性 public Cat() { super("orange", 4); // 直接传固定值给父类构造 } @Override public String move() { return "I'm moving with " + leg_number + " legs!"; } } class Bug extends Animal { public Bug() { super("green", 16); } @Override public String move() { return "I'm moving with " + leg_number + " legs!"; } } class Bird extends Animal { private int wing_number; // 只保留新增的wing_number属性 public Bird(int wing_number) { super("yellow", 2); this.wing_number = wing_number; } @Override public String move() { // 无参重写父类方法 if (this.wing_number > 0) { return "I'm flying"; } else { return "I'm moving with " + leg_number + " legs!"; } } }
如果作业允许自定义不同实例的颜色和腿数,就删掉构造方法里写死覆盖属性的代码,保留原有参数即可,此时new Cat("orange",4)就是完全符合要求的写法。
2. 实例化方式
调整后实例化不需要传颜色和腿数参数,直接调用对应构造即可:
// Main方法中实例化示例 Animal myCat = new Cat(); Animal myBug = new Bug(); Animal myBird = new Bird(2); // 只需要传翅膀数量 // 调用move方法示例 System.out.println(myCat.move()); System.out.println(myBird.move());
内容的提问来源于stack exchange,提问作者apex2022
相关产品推荐
相关产品推荐

