覆盖java中的“私有”方法

时间:2016-01-22 03:33:01

标签: 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函数放在另一个类中时,我遇到了编译错误。

5 个答案:

答案 0 :(得分:11)

您无法覆盖private方法。如果您将A投放到B,则无法看到。您可以覆盖protected方法,但这不是您在此处所做的事情(是的,如果您将main移至{{ 1}}然后你会得到另一种方法。当你打算覆盖时我会推荐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()的错误?

The Java Tutorials: Predefined Annotation Types说(部分)

  

虽然在覆盖方法时不需要使用此批注,但它有助于防止出错。如果标有private的方法无法正确覆盖其某个超类中的方法,则编译器会生成错误。

答案 1 :(得分:4)

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

由于 t B 类型的on对象,因此调用don()方法将调用B中定义的方法。它甚至不知道那里是一个在 A

类中也命名为don()的方法

答案 2 :(得分:4)

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

答案 3 :(得分:4)

  

这是因为主要功能与方法相同的类#&#34; don&#34;

不,这是因为A&#39; don()B的{​​{1}}方法无关,尽管相同的名称和参数列表。 don()个方法隐藏在他们的类中。它们不能由外部调用者直接调用,例如在您的情况下使用private方法,因为它们封装在类中。他们不参与方法覆盖。

答案 4 :(得分:2)

私人成员对任何其他类都不可见,甚至是儿童

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

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中看到私有方法。