子类不能重写父类私有方法,因其静态绑定且对子类不可见;而子类可继承非private的父类内部类,因内部类是独立类型,可见性决定继承权限,二者逻辑、作用域与设计目的均不同。

子类不能重写父类的私有方法,是因为私有方法在编译期就被绑定(静态绑定),且对子类不可见——子类根本“不知道”它的存在。而子类能继承父类的内部类,是Java语言明确规定的语法特性,二者逻辑不同、作用域不同、设计目的也不同。
私有方法不被继承,也不可重写
父类中用 private 修饰的方法,仅在该类内部可见。子类在编译时无法访问它,更谈不上继承或重写。
- 你在子类里写一个同名、同参数、同返回类型的方法,不是重写,而是定义了一个全新的方法;
- @Override 注解会报错,因为编译器找不到可被重写的父类方法;
- 私有方法调用走的是静态绑定,在字节码层面直接指向父类中的具体实现,不参与运行时多态。
内部类是独立类型,可被继承
父类的非静态内部类(即成员内部类)本质上是一个“依附于外部类实例”的普通类。只要它不是 private 修饰的,子类就可以继承它——这和继承普通类一样,不违反封装原则。
- 如果内部类是 public 或 protected,子类可直接 extends 它;
- 如果内部类是 default(包级私有),同包下的子类也可继承;
- 如果内部类是 private,则仅限外部类自身使用,子类无法访问,自然也不能继承。
关键区别:可见性决定能否继承
继承的前提是“可访问”。private 方法和 private 内部类都受限于访问权限,但限制范围不同:
- private 方法:仅限声明它的类内调用,子类连名字都看不到;
- private 内部类:仅限外部类内使用,但其他访问级别的内部类(如 public)对外暴露为一个完整类型,子类可像继承普通类那样继承它。
实际编码中常见误区
有人误以为“内部类被继承后,就能间接重写父类私有方法”,这是混淆了层级关系。即使子类继承了父类的内部类,该内部类依然只能访问自己所在外部类(即父类)的 private 成员——但这不等于子类本身获得了访问或重写权限。
- 内部类访问父类 private 成员,靠的是编译器生成的桥接方法(bridge method),属于编译器支持的特例;
- 子类仍无法绕过访问控制去调用或覆盖父类 private 方法;
- 继承内部类 ≠ 继承父类的 private 方法,二者没有传导关系。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











