为什么此代码没有';你不调用子类吗?Java中的继承

为什么此代码没有';你不调用子类吗?Java中的继承,java,inheritance,Java,Inheritance,这是输出:- 我是父母 ----这是::--datastructures.lists.heritation。Child@1a692dec 这是我的孩子 对象的类型是Child,但它不调用Child方法和父方法。我已经给出了这个 在Parent类中,您已将printChild声明为private。。。并称之为。无法重写私有方法。Child类中的printChild对于父类来说是未知的 如果将private修饰符更改为public,则会有一个覆盖,您的示例应该输出您所期望的内容 为什么Java不允

这是输出:-

我是父母

----这是::--datastructures.lists.heritation。Child@1a692dec

这是我的孩子


对象的类型是Child,但它不调用Child方法和父方法。我已经给出了这个

Parent
类中,您已将
printChild
声明为private。。。并称之为。无法重写私有方法。
Child
类中的
printChild
对于
父类来说是未知的

如果将
private
修饰符更改为
public
,则会有一个覆盖,您的示例应该输出您所期望的内容


为什么Java不允许重写私有方法?好的,基本上,如果你能做到这一点,那么就没有办法用一个子类无法打破的抽象边界来编写一个类。这将是(国际海事组织)一个主要的语言设计短


为什么Java不报告错误或警告?没有错误,因为根据JLS,这是合法的Java。至于警告。。。如果单独编译
Parent
,则没有问题,因为编写的代码声明并使用私有方法。如果单独编译
Child
,编译器将无法在
Parent
类中看到私有方法。(事实上,它甚至可能不存在于编译所针对的
父类的.class文件版本中。)只有同时编译
父类
子类
,编译器才能发现一些奇怪的东西。

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

private
方法不会被继承。当您调用
printParent
时,您将e在
父对象上调用方法,当该方法引用
this
时,它引用的是该类的实例(
父对象
),它有自己的
printChild
方法。将
Parent#printChild
a
protected
方法制作成一个
protected
方法应该会得到预期的结果。

在本程序中,我们必须记住两点:

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

  • private
    static
    final
    方法不能被重写


  • 使用受保护的非私有方法

    ,因为该方法的作用域是私有的,它对其他类不可见。

    这是因为
    子类
    没有
    打印父类
    方法是的,但当我调用它时,它确实有printChild方法。printChild()它应该是子方法,不是吗?私有方法不能被重写。而且,
    Private
    方法不能直接从其他类调用。您没有犯错误吗?Protected必须放在父类中吗?
    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();
        }
    }
    
    public class Child extends Parent {
        protected void printChild(){
            System.out.println("I am the child");
        }
    }