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();
答案 0 :(得分:5)
在Parent
类中,您已将printChild
声明为私有...并将其调用。无法覆盖私有方法。 printChild
班级不知道Child
班级中的Parent
。
如果您要将private
修饰符更改为public
,那么将覆盖,并且您的示例应输出您的内容期待着。
为什么Java不允许您覆盖私有方法?好吧,基本上,如果你能做到那么就没有办法写一个带有子类无法破解的抽象边界的类。那将(IMO)成为一种主要的语言设计短缺。
为什么Java报告错误或警告?那么没有错误,因为根据JLS,这是合法的Java。至于警告......如果单独编译Parent
没有问题,因为编写的代码是声明并使用私有方法。如果单独编译Child
,则编译器无法在Parent
类中看到私有方法。 (实际上,它可能甚至不存在于您正在编译的Parent
的.class文件版本中。)只有在您同时编译Parent
和Child
时才会出现这种情况。 >可能编译器发现有点奇怪的东西。
答案 1 :(得分:0)
关键字“this”指向当前的类实例,这里是私有的void printChild()。然后你在RelationshipTester类中创建了一个Child类的对象。这两个函数的范围是私有的,这意味着仅限于该类。因此,它不会覆盖子类并执行Base类的方法。
答案 2 :(得分:0)
private
方法不会被继承。当您致电printParent
时,您正在Parent
上调用方法,当该方法引用this
时,它会引用该类的实例({{ 1}}),它有自己的Parent
方法。制作printChild
Parent#printChild
方法应该会给出预期的结果。
答案 3 :(得分:0)
在这个程序中,我们必须记住2点:
如果我们为子类(这里是子)创建一个对象,那么也为超类创建了内存。这意味着如果在子类中找不到我们正在调用的方法,那么Java虚拟机将转到父类并检查我们正在调用的方法,如果找到该方法,它将执行。如果在子类本身中找到该方法,则不会转到父类。
private
,static
和final
方法无法覆盖。
答案 4 :(得分:0)
public class Child extends Parent {
protected void printChild(){
System.out.println("I am the child");
}
}
使用受保护的,而不是私人的
答案 5 :(得分:0)
由于该方法的范围是私有的,因此其他类不可见。