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

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

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

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

对此的输出是:

Person
Person

为什么第二行不是学生?父母getInfo()是私人的,但这是否意味着printPerson()阻止第二个电话找到孩子getInfo()(这是公共的)?我认为子方法不能继承私有getInfo(),因此不会发生覆盖。

4

3 回答 3

3

父 getInfo() 是私有的,但这是否意味着 printPerson() 的第二次调用被阻止找到子 getInfo() (这是公共的)?

是的。子类的getInfo()方法并没有覆盖超类的方法,因为它甚至在逻辑上都不知道它。私有方法不能被覆盖。

JLS 的第 8.4.8.1 节

在类 C 中声明的实例方法 m1 覆盖在类 A 中声明的另一个实例方法 m2,前提是满足以下所有条件:

  • C 是 A 的子类。
  • m1 的签名是 m2 签名的子签名(第 8.4.2 节)。
  • 任何一个:
    • m2 是公共的、受保护的或在与 C 相同的包中声明为具有默认访问权限,或
    • m1 覆盖方法 m3(m3 不同于 m1,m3 不同于 m2),这样 m3 会覆盖 m2。

请注意第一个子项目符号 - 在您的情况下,m2is Person.getInfo,并且它不是公共的、受保护的或在同一个包中使用默认访问权限声明的 - 因此子项目符号不适用。另一个子项目符号也不适用,因此您没有满足覆盖的所有要求。

当您尝试覆盖超类中的方法时,您应该使用@Override注释 - 这样,如果您做错了什么,您将收到编译时错误,而不仅仅是在执行时出现意外行为。

于 2013-09-16T06:12:52.180 回答
0

getInfo方法不会被Student类覆盖,因此当调用 printPerson 转到 getInfo 时,它会执行本地 getInfo 方法。

于 2013-09-16T06:19:49.907 回答
0

如果该方法打算被子类覆盖,则该方法应该对子类可见。

即您应该将该getInfo()方法声明为受保护而不是私有。

于 2013-09-16T06:14:27.920 回答