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

为何子类继承的public方法无法调用子类的private方法?

问题:为什么继承的printPerson()无法调用子类的private getInfo()?

首先看这段Java代码:

public class Test 
{
    public static void main(String[] args) 
    {
        new Person().printPerson(); // 输出 Person
        new Student().printPerson(); // 输出 Person : Line 6
    }
}
class Student extends Person 
{
    private String getInfo() // Line 11
    {
        return "Student";
    }
}
class Person 
{
    private String getInfo() 
    {
        return "Person";
    }
    public void printPerson() 
    {
        System.out.println(getInfo());
    }
}

原解释提到第6行输出Person而非Student,是因为Student类的getInfo()是private的,仅能在Student内部调用。但疑问在于:

Person类的printPerson()是public的,会被Student继承,那这个方法在Student类中可用,为何不能调用Student类的private getInfo()?毕竟printPerson()和getInfo()都属于Student类(前者通过继承获得)。


解答

核心要搞清楚Java中private方法的特性和继承方法的执行上下文:

  • private方法不参与继承和多态
    Person类的getInfo()是private,它完全是Person类的私有成员,子类Student根本无法“看到”这个方法,更谈不上重写。Student里定义的private getInfo(),是一个全新的、和父类毫无关系的方法,两者只是名字相同而已。

  • 继承的方法执行时,依然处于父类的上下文
    Student继承了printPerson(),但这个方法的代码逻辑是在Person类中写的。当你调用new Student().printPerson()时,方法的执行逻辑还是按照Person类的代码来走——它只能访问Person类能看到的成员,也就是Person自己的private getInfo(),根本不知道Student类里还有另一个getInfo()。

  • private成员的访问范围严格限定在类内部
    Student的private getInfo(),只有Student类自己定义的代码才能调用。而printPerson()是从Person继承来的,它的代码属于Person类,不属于Student的内部代码,哪怕这个方法在Student实例上运行,也没有权限访问Student的private成员。

总结一句话:继承来的方法,本质还是父类的方法,只能用父类能访问到的东西,子类的private成员对它来说是完全不可见的。


内容的提问来源于stack exchange,提问作者Elias El hachem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 23:32:56