在超类中重写私有方法-有办法吗?

时间:2019-12-07 00:45:52

标签: java inheritance

我知道,如果要执行此方法,该方法将被保护为非私有方法,但是我想创建自己的PriorityQueue,这将需要多次调用siftUp。我无法编辑该字段的声明,因为PriorityQueue是Java库的一部分,因此我正在寻找另一种调用它的方法。我唯一能做的就是从库中复制整个类并将其更改为我的需要吗?

1 个答案:

答案 0 :(得分:2)

不幸的是,没有任何方法可以覆盖超类的私有方法。

根据Oracle's documentation on Controlling Access to Members of a Class,私有方法仅供类本身访问。

以下是超类对子类可见性的表:

Superclass and subclass

Superclass's member visibility to subclass

我相信他们通过提供 private 可见性,为开发人员提供了实现“最低特权”原则的途径,因此无法在创建该类的类之外的任何地方对其进行访问。 / p>

如果您希望能够覆盖它,则应使其受到保护或不赋予任何修饰符(被视为“打包访问”级别)。< / p>

这里是一个例子:

package this.silly.package;

public class Foo() {
    void thisAction() {
        // do stuff...
    }

    private void somethingElse() {
        // Do secret stuff.
    }
}
package this.silly.package;

public class Bar extends Foo() {

    // This will work 
    // because this class is in the same package as Foo.
    @Override
    void thisAction() {
        // Do something else
    }

    // This will not work
    // because Foo made this method private,
    // so it is only accessible by Foo.
    @Override
    private void somethingElse() {
        // Please don't do secret stuff. You might drive me crazy!
    }
}