You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Java多态中Student.printPerson()执行逻辑的技术问询

Java方法调用与访问修饰符问题解答

代码示例

public class Test{
  public static void main(String[] args){
     new Person().printPerson();
     new Student().printPerson();
  }
}

class Student extends Person{
   private String getInfo(){
      return"Student";
   }
}

class Person{
  private String getInfo(){
    return "Person";
  }

  public void printPerson(){
    System.out.println(getInfo());
  }
}

问题解答

1. 执行Person的printPerson()时调用的是哪个getInfo()?

会调用Person类自身的getInfo()方法,具体原因如下:

  • Java中private修饰的方法属于类的私有成员,无法被继承,也不支持重写。Student类里的private getInfo()只是一个和父类同名的独立方法,和Person的getInfo()没有任何继承或重写关联。
  • 当执行Person类的printPerson()方法时,方法内部调用getInfo(),由于getInfo()是private的,Java在编译阶段就会确定调用的是当前类(Person)的getInfo(),这属于静态绑定逻辑,不会根据运行时的对象类型(此处是Student对象)去动态查找子类的方法。所以哪怕实际对象是Student,只要执行的是Person的printPerson(),就只会调用Person的getInfo()。

2. getInfo()的访问修饰符对程序输出的影响

不同访问修饰符会直接影响方法的继承、重写规则,进而改变输出结果:

  • 均为private时:两个getInfo()是各自类的私有方法,无继承关系。printPerson()始终调用自身类的getInfo(),程序输出为:
    Person
    Person
    
  • 均为public时:Student的getInfo()是对Person方法的合法重写。此时printPerson()调用getInfo()属于动态绑定,会根据运行时的实际对象类型选择方法:Person对象调用Person的getInfo(),Student对象调用Student的getInfo(),输出为:
    Person
    Student
    
  • 父类为protected/默认权限,子类为相同或更宽松权限时:只要子类能访问父类的getInfo()并完成重写,就会触发动态绑定,输出结果和均为public时一致。但如果子类方法的访问权限比父类更严格(比如父类是public,子类是private),Java会直接编译报错——重写时子类方法的访问权限不能低于父类。

内容的提问来源于stack exchange,提问作者Asuka Langley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:06:45