多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
题目: ~~~ public class PackageDemo { private void sayHello() { System.err.println("base:hello"); } public static void main(String[] args) { PackageDemo demo = new Impl(); demo.sayHello(); } } class Impl extends PackageDemo { public void sayHello() { System.err.println("Impl:hello"); } } output===> base:hello ~~~ 当子类位于当前类内部、同一包下、其他包下时访问权限会发生什么变化呢?是否还遵循表格中的规定呢?对于这个问题,我们只需要记住**最大访问权限原则**即可,所谓最大访问权限原则即子类的在不同位置时访问权限修饰符表现的实际权限以最大的那个为准。依据该原则,子类在不同位置时对父类中的方法及变量的访问权限如下表所示: | 子类中访问权限 | 当前类 | 同包 | 其他包 | | --- | --- | --- | --- | | public | √ | √ | √ | | protected | √ | √ | √ | | default | √ | √ | × | | private | √ | × | × | 回到题目中,由于子类Impl与父类Base位于同一包下,而Base中的sayHi()方法的修饰符为private,对子类不可见,因此不满足方法重写的要求,因此调用的仍然是Base中的方法,而非子类中的方法