繁体   English   中英

覆盖Java中的“私有”方法

[英]Override “private” method in java

这个想法有些含糊不清,我需要澄清。

我的问题是使用此代码时:

public class B {

    private void don() {
        System.out.println("hoho private");
    }
    public static void main(String[] args) {
        B t = new A();
        t.don();
    }
}

class A extends B {
    public void don() {
        System.out.println("hoho public");
    }
}

输出是hoho private

这是因为main函数与don方法在同一个类中,还是由于重写?

我已经在书中读过这个想法,当我将main函数放到另一个类中时,我会遇到编译器错误。

您不能覆盖private方法。 如果将A强制转换为B则不可见。 可以覆盖一个protected方法,但这不是您在这里所做的(是的,在这里,如果将main移动到A您将获得另一个方法。当您打算覆盖时,建议使用@Override注解,

class A extends B {
    @Override
    public void don() { // <-- will not compile if don is private in B.
        System.out.println("hoho public");
    }
}

在这种情况下,为什么没有编译器提供使用错误t.don()这是private

Java教程:预定义的注释类型说(部分)

虽然在重写方法时不需要使用此批注,但它有助于防止错误。 如果标有@Override的方法未能正确覆盖@Override类之一中的方法,则编译器将生成错误。

这是因为主函数与方法“ don”位于同一类中

不,这是因为尽管名称和参数列表相同,但Adon()Bdon()方法无关。 private方法隐藏在其类中。 它们不能由外部调用程序直接调用,例如您的情况下的main方法,因为它们封装在类中。 他们不参与方法重写。

不可以,因为不能从任何其他类中看到私有方法,所以不能覆盖它。 您为子类声明了一个与超类方法无关的新方法。 一种看待它的方法是问自己,在Derived类中编写super.func()是否合法。

您不能覆盖私有方法,但可以毫无问题地在派生类中引入一个私有方法。 派生类无法访问祖先上的私有方法。

由于tB类型的on对象,因此调用don()方法将调用在B处定义的方法。它甚至不知道在类A处也有一个名为don()的方法

私人成员对其他任何班级都不可见,即使是孩子

您不能覆盖私有方法,但是再次,您也不能调用它。 但是,您可以在子级中创建具有相同名称的相同方法。

public class A
{
    private int calculate() {return 1;}
    public void visibleMethod()
    {
        System.out.println(calculate());
    };
}

public class B extends A
{
    private int calculate() {return 2;}
    public void visibleMethod()
    {
        System.out.println(calculate());
    };
}

如果调用A.visibleMethod(),它将打印出1。

如果您调用B.visibleMethod(),它将显示2。

如果您未在B中实现私有的calculate()方法,则不会编译该方法,因为调用它的公共方法在A中看不到私有方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM