Java继承问题:父类运行正常子类调用属性返回null值
问题根因
你的代码出现null值主要是3个核心错误导致:
- 子类
RoomFrontEnd重复定义了和父类Room同名的私有属性roomID、floor:父类的set方法只会给父类的私有属性赋值,子类toString方法读取的是子类自己定义的、从未赋值的同名属性,自然返回null。 - 房型相关方法签名完全不匹配:父类设置房型的方法名为
setRoomType(String)、获取房型的方法名为getRoomType(),你子类写的setRoomTypeID(Integer)、getRoomTypeID()和父类方法完全对不上,既没有正确重写父类方法,参数类型Integer也和你传入的字符串类型房型编码不兼容,导致房型赋值失败返回null。 - 测试代码调用了不存在的方法:父类并没有定义
setRoomTypeID方法,你读取文件后调用room[i].setRoomTypeID(read.next())属于笔误,应该调用父类已有的setRoomType方法。
修复方案
- 删除子类
RoomFrontEnd中重复定义的roomID、floor属性,这两个字段不需要子类额外处理,直接调用父类的getter方法取值即可。 - 修正子类的房型相关方法,和父类方法签名对齐,正确重写父类方法。
- 修正子类
toString方法,通过父类的getter方法获取roomID、floor的值。 - 修正测试代码中的方法名笔误。
修正后代码示例
修正后的子类代码
public class RoomFrontEnd extends Room { // 只保留子类需要自定义逻辑的属性 private String roomType; private String roomStatus; // 重写父类的setRoomType方法,参数类型改为和父类一致的String @Override public void setRoomType(String roomTypeID) { if (roomTypeID.equals("RT1")) { this.roomType = "单人间"; } else if (roomTypeID.equals("RT2")) { this.roomType = "双人间"; } } // 重写父类的getRoomType方法,返回转义后的房型名称 @Override public String getRoomType() { return this.roomType; } @Override public void setRoomStatus(String roomStatus) { if (roomStatus.equals("1")) { this.roomStatus = "可用"; } else if (roomStatus.equals("0")) { this.roomStatus = "不可用"; } } @Override public String getRoomStatus() { return this.roomStatus; } @Override public String toString() { // 调用父类的getter方法获取不需要转义的字段值 return getRoomID() + " " + roomType + " 楼层 " + getFloor() + " " + roomStatus; } }
测试代码修正点
把读取文件时的
room[i].setRoomTypeID(read.next());
改为
room[i].setRoomType(read.next());
修改完成后运行即可正常输出所有字段值,不需要把所有getter/setter都搬到子类,符合你使用继承的设计初衷。
内容的提问来源于stack exchange,提问作者Chin
相关产品推荐
相关产品推荐

