为什么内部类可以重写私有的最终方法?

2022-08-31 15:00:17

我想知道将私有方法声明为 final 是否有意义,我认为这没有意义。但是我想象有一个排他性的情况,并编写了代码来弄清楚它:

public class Boom {

    private void touchMe() {
        System.out.println("super::I am not overridable!");
    }

    private class Inner extends Boom {

        private void touchMe() {
            super.touchMe();
            System.out.println("sub::You suck! I overrided you!");
        }
    }

    public static void main(String... args) {
        Boom boom = new Boom();
        Boom.Inner inner = boom.new Inner();
        inner.touchMe();
    }
}

它编译并工作。“我应该让touchMe()最终”我想并做到了:

public class Boom {

    private final void touchMe() {
        System.out.println("super::I am not overridable!");
    }

    private class Inner extends Boom {

        private void touchMe() {
            super.touchMe();
            System.out.println("sub::You suck! I overrided you!");
        }
    }

    public static void main(String... args) {
        Boom boom = new Boom();
        Boom.Inner inner = boom.new Inner();
        inner.touchMe();
    }
}

它也有效并告诉我

chicout@chicout-linlap:~$ java Boom
super::I am not overridable!
sub::You suck! I overrided you!

为什么?


答案 1

私有方法不能被覆盖(私有方法不被继承!实际上,是否声明私有方法 final 也没有任何区别。

您声明的两个方法是两个完全独立的方法,它们恰好共享相同的标识符。引用的方法与 不同,事实只是因为阴影(而不是因为它覆盖了它)。Boom.touchMeBoom.Inner.touchMesuper.touchMetouchMeBoom.Inner.touchMeBoom.touchMe

这可以通过多种方式来证明:

  • 正如您自己发现的那样,如果您将方法更改为公共方法,编译器会抱怨,因为您突然尝试重写最终方法。

  • 如果将方法保持为私有并添加注释,编译器将抱怨。@Override

  • 正如alpian所指出的,如果你将对象转换为一个对象(),则被调用(如果它确实被覆盖,则强制转换无关紧要)。Boom.InnerBoom((Boom) inner).touchMe()Boom.touchMe

相关问题:


答案 2

我认为这里确实有两种独立方法的事实可以通过更改您的主要方法很好地证明,如下所示:

public static void main(String... args) {
    Boom boom = new Boom();
    Boom.Inner inner = boom.new Inner();
    inner.touchMe();
    System.out.println("And now cast it...");
    ((Boom)(inner)).touchMe();
}

现在打印:

super::I am not overridable!
sub::You suck! I overrided you!
And now cast it...
super::I am not overridable!

调用 工作的原因是,您正在查找一个在超类 () 中调用的方法,该方法确实存在,并且与在同一类中一样可见。superInnertouchMeBoomInner


推荐