Java子类继承父类ArrayList变量及调用setter报错问题
编译错误根因与修正方案
错误本质拆解
- 子类构造方法里单独写的
rooms;是纯冗余的无效代码。Java不存在“写个变量名就完成继承声明”的逻辑——rooms是父类Home中没有被private锁死的成员变量,子类定义时就自动获得了对这个变量的访问权限,根本不需要额外写代码做什么继承操作,单独放个变量名不做任何赋值、方法调用的写法本身就不符合语法规范,直接删掉就行。 - 触发编译报错的核心原因是方法调用的主体搞错了。
setRooms是你定义在父类Home上的类成员方法,根本不属于rooms这个ArrayList实例。你写的rooms.setRooms(...)逻辑,是要求ArrayList对象去调它自带的方法——但ArrayList类从设计之初就没有setRooms这个方法,编译器自然会抛出“找不到符号”的错误。
正确实现方式
Department作为Home的子类,本来就继承了父类的公开setRooms方法,调用的时候根本不需要把方法绑在rooms变量上。
修正后的子类代码如下:
class Department extends Home { public Department() { // 继承自父类的foo变量可直接赋值,原有逻辑无需改动 foo = "foo"; // 直接调用继承来的setRooms方法即可 setRooms(new HomeAbstraction(50)); } }
容易踩的混淆点
- 如果你不想走setter,也可以直接操作父类的
rooms变量写rooms.add(new HomeAbstraction(50));——毕竟你定义的rooms是包访问权限,同包子类确实能拿到,但这种写法会完全绕开你在父类里封装的setter逻辑,违背你最初写setter的设计初衷。 - 一定要分清两类方法的调用主体:
Home.setRooms是Home类对外提供的操作房间集合的封装入口;rooms是Home内部持有的ArrayList实例,它能调用的只有ArrayList原生的add()、remove()、size()这类自带方法,别把两个层级的方法调用搞混。
内容的提问来源于stack exchange,提问作者ibitebyt3s
相关产品推荐
相关产品推荐

