为什么这段代码不会调用子类? Java中的继承

时间:2015-06-06 01:13:53

标签: java inheritance

public class Parent {
    public  void printParent()
    {
        System.out.println("I am the Parent");
        System.out.println("----this is ::---" + this);
         this.printChild();
    }
    private void printChild()
    {
        System.out.println("This is my child");
    }
}

public class Child extends Parent {
    private void printChild()
    {
        System.out.println("I am the child");
    }
}

public class RelationshipTester {
    @Test
    public  void testRelation()
    {
        Child parent = new Child();
        parent.printParent();
    }
}

这是输出: -

我是父母

----这是:: --- datastructures.lists.inheritance.Child@1a692dec

这是我的孩子

该对象属于Child类型,但它不会调用子方法和父方法。我已经给了this.printChild();

6 个答案:

答案 0 :(得分:5)

Parent类中,您已将printChild声明为私有...并将其调用。无法覆盖私有方法。 printChild班级不知道Child班级中的Parent

如果您要将private修饰符更改为public,那么覆盖,并且您的示例输出您的内容期待着。

为什么Java不允许您覆盖私有方法?好吧,基本上,如果你能做到那么就没有办法写一个带有子类无法破解的抽象边界的类。那将(IMO)成为一种主要的语言设计短缺。

为什么Java报告错误或警告?那么没有错误,因为根据JLS,这是合法的Java。至于警告......如果单独编译Parent没有问题,因为编写的代码是声明并使用私有方法。如果单独编译Child,则编译器无法在Parent类中看到私有方法。 (实际上,它可能甚至不存在于您正在编译的Parent的.class文件版本中。)只有在您同时编译ParentChild时才会出现这种情况。 >可能编译器发现有点奇怪的东西。

答案 1 :(得分:0)

关键字“this”指向当前的类实例,这里是私有的void printChild()。然后你在RelationshipTester类中创建了一个Child类的对象。这两个函数的范围是私有的,这意味着仅限于该类。因此,它不会覆盖子类并执行Base类的方法。

答案 2 :(得分:0)

private方法不会被继承。当您致电printParent时,您正在Parent上调用方法,当该方法引用this时,它会引用该类的实例({{ 1}}),它有自己的Parent方法。制作printChild Parent#printChild方法应该会给出预期的结果。

答案 3 :(得分:0)

在这个程序中,我们必须记住2点:

  1. 如果我们为子类(这里是子)创建一个对象,那么也为超类创建了内存。这意味着如果在子类中找不到我们正在调用的方法,那么Java虚拟机将转到父类并检查我们正在调用的方法,如果找到该方法,它将执行。如果在子类本身中找到该方法,则不会转到父类。

  2. privatestaticfinal方法无法覆盖。

答案 4 :(得分:0)

public class Child extends Parent {
    protected void printChild(){
        System.out.println("I am the child");
    }
}

使用受保护的,而不是私人的

答案 5 :(得分:0)

由于该方法的范围是私有的,因此其他类不可见。