Java继承中为何子类访问父类private字段有时需用protected?
核心原因:你的第一个程序子类根本没有直接访问父类private字段
你贴出的两段子类代码都只调用了父类的public构造方法,本身都不会触发访问权限报错。你第二个程序报错,是因为你在DeluxeBurger类里还写了直接读写父类Hamburger私有字段的逻辑(比如直接操作this.price、this.addition1这类代码),这部分你没有贴出来而已。
Java private访问规则
private修饰的类成员,只有当前类的内部代码可以直接访问,子类、其他外部类都没有直接访问权限:
- 第一个程序的
Mitsubishi子类,只是把参数传给父类Car的构造方法,是父类自己的构造方法在内部给私有字段赋值,子类全程没有碰过父类的私有字段,完全符合访问规则,当然不会报错。 - 第二个程序你在
DeluxeBurger里直接读写Hamburger的私有字段,相当于子类越过父类直接操作父类的封装属性,自然会触发权限报错。
为什么改成protected就能解决
protected修饰的成员,允许同包下所有类、不同包的子类直接访问,修改后子类就有权限直接读写这些字段,报错自然消失。
补充最佳实践
不建议直接把父类字段改成protected破坏封装性,更合理的做法是父类提供对应protected/public的getter、setter方法,子类通过调用这些方法操作父类字段,后续父类要加参数校验逻辑也不用改子类代码。
内容的提问来源于stack exchange,提问作者Machigan
相关产品推荐
相关产品推荐

