超类方法在子类中找不到重写方法

时间:2013-09-16 06:10:55

标签: java inheritance encapsulation

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(),所以不会发生覆盖。

3 个答案:

答案 0 :(得分:3)

  

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

是。子类的getInfo()方法不是覆盖超类的方法,因为它甚至没有逻辑知道关于它。私有方法无法覆盖。

来自section 8.4.8.1 of the JLS

  

在类C中声明的实例方法m1将覆盖在类A中声明的另一个实例方法m2,如果以下所有条件都为真:

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

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

当你试图覆盖超类中的方法时,你应该使用@Override注释 - 这样如果你做错了什么,你会得到一个编译时错误,而不仅仅是意外执行时的行为。

答案 1 :(得分:0)

如果该方法旨在被子类重写,则该方法应该对子类可见。

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

答案 2 :(得分:0)

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