
Java中私有方法(private)不参与继承与多态,即使子类定义了同名私有方法,也仅是独立存在;父类中被public方法调用的private方法始终绑定到父类自身,不会动态分派到子类。
java中私有方法无法被子类重写,因此父类公开方法调用的仍是自身私有版本
在Java面向对象机制中,方法的可访问性决定了它能否被继承和重写。private修饰的方法具有最严格的封装性:它仅在声明它的类内部可见,既不能被子类继承,也不能被重写(override),甚至不能被子类直接访问——哪怕子类中恰好存在签名完全相同的private方法,两者也互不干扰,属于独立的、各自作用域内的方法。
回到示例代码:
class Person {
private String getInfo() {
return "Person";
}
public void printPerson() {
System.out.println(getInfo()); // 编译期静态绑定:永远调用 Person.getInfo()
}
}
class Student extends Person {
private String getInfo() { // ✅ 合法:这是Student自己的私有方法,与Person无关
return "Student";
}
}
当执行 new Student().printPerson() 时:
-
printPerson()继承自Person,其字节码中对getInfo()的调用指令(invokespecial)在编译期就已确定目标为Person.getInfo(); - 尽管
Student类中也定义了getInfo(),但由于它是private,Person.printPerson()根本“看不见”它,更无法动态绑定; - 因此输出恒为
"Person",而非"Student"。
⚠️ 关键误区澄清:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
“
printPerson()在Student中可用” ≠ “它能在Student上下文中调用Student.getInfo()”。
继承的是方法声明(即printPerson()可被Student实例调用),但该方法内部的实现逻辑(包括对private方法的调用)完全固化在父类中,不受子类定义影响。
✅ 正确做法:若需多态行为,应将 getInfo() 声明为 protected 或 public,并配合 @Override 显式重写:
class Person {
protected String getInfo() { // 改为 protected
return "Person";
}
public void printPerson() {
System.out.println(getInfo()); // 运行时动态绑定
}
}
class Student extends Person {
@Override // 编译器强制检查:确保正确重写
protected String getInfo() {
return "Student";
}
}
此时 new Student().printPerson() 将输出 "Student" —— 这才是符合预期的多态行为。
? 总结:
-
private方法 = 不可继承、不可重写、不可多态; - 父类中
private方法的调用永远静态绑定到该父类; - 使用
@Override注解是识别重写意图的黄金实践:若误以为可重写private方法,编译器会立即报错,避免隐晦逻辑错误。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










