java - 为什么内部类可以覆盖私有(private) final方法?

标签 java overriding inner-classes final

我想知道将私有(private)方法也声明为 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!

为什么?

最佳答案

私有(private)方法不能被覆盖(私有(private)方法是不能被继承的!)其实私有(private)方法声明不final没有区别。

您声明的两个方法,Boom.touchMeBoom.Inner.touchMe 是两个完全独立的方法,它们恰好共享相同的标识符。 super.touchMe 指的是与 touchMe 不同的方法,这是因为 Boom.Inner.touchMe shadows Boom.touchMe(并不是因为它覆盖了它)。

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

  • 正如您自己发现的那样,如果您将方法更改为公开的,编译器会提示,因为您突然尝试覆盖 final方法。

  • 如果您保持方法私有(private)并添加 @Override 注释,编译器会报错。

  • 正如 alpian 指出的,如果您将 Boom.Inner 对象转换为 Boom 对象 (((Boom) inner).touchMe( )) Boom.touchMe 被调用(如果它确实被覆盖了,那么强制转换无关紧要)。

相关问题:

关于java - 为什么内部类可以覆盖私有(private) final方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9524025/

相关文章:

java - 未经检查的 cast Map <String, String> allPreferences

Java + gRPC : Error: A JNI error has occurred

java - java可以在其他对象而不是子类型中调用父覆盖方法吗?

java - 调用 method.getReturnType().newInstance()(静态内部类的静态方法)时出现 InstantiationException

java - 使用 InetAddress 或 System.getenv 获取主机名哪个更好

java - Java中重写接口(interface)方法

c++ - C++中如何从内部类访问外部类对象

java - 静态/非静态内部类 : The type parameter T is hiding the type T

java - 错误 :(124, 9) 错误:方法没有覆盖或实现父类(super class)型的方法

java - 应用程序在@Override 点不断崩溃