最后一个修饰符是Unexpected Behavior



这是我的代码

package alpha ;
class A1
{
    static class A11
    {
        private
            final // WHAT IS THE EFFECT OF THIS MODIFIER?
            void fun ( String caller )
            {
                System . out . println ( "A11:t" + caller ) ;
            }
    }
    static class A12 extends A11
    {
        private void fun ( String caller )
        {
            super . fun ( caller + caller ) ;
        }
    }
    public static void main ( String [ ] args )
    {
        A12 a12 = new A12 ( ) ;
        a12 . fun ( "Hello" ) ;
    }
}

我发现在A1中有或没有最终修改。A11程序编译并运行。

如果没有最后的修饰语A1,我可以理解。A12可以看到并因此覆盖有趣的方法。它是私有的,但它们在同一个类中,所以没有可见性问题。

我不明白为什么它和final修饰语一起工作。不应该在A1中重写。被禁止吗?

这是带有最后一个修饰符

的程序输出
java alpha/A1
A11:    HelloHello

如果它只是忽略了其他有趣的方法,那么

  1. 编译器不会抱怨超级引用
  2. A11不会出现在输出

你的方法是private

将它们的可见性更改为protected以查看预期的行为,也就是说,只有当方法是受保护的,公共可见性或默认可见性时,重写的概念甚至存在

做这样的事情——

class A1
{
    static class A11
    {
        public
            final // WHAT IS THE EFFECT OF THIS MODIFIER?
            void fun ( String caller )
            {
                System . out . println ( "A11:t" + caller ) ;
            }
    }
    static class A12 extends A11
    {
        public void fun ( String caller )
        {
            super . fun ( caller + caller ) ;
        }
    }
    public static void main ( String [ ] args )
    {
        A12 a12 = new A12 ( ) ;
        a12 . fun ( "Hello" ) ;
    }
}

现在会抛出编译时异常

fun(java.lang.String) in A1.A12 cannot override fun(java.lang.String) in A1.A11; overridden method is final

对于public, protected和包私有/默认访问方法,final确实可以防止方法被覆盖。

然而,所有private方法都是"非虚拟的",因此实际上是最终的。父类中的private方法对派生类没有影响。你没有重写,只是基类中的方法被忽略了。

JVM所基于的第一版Java语言规范没有内部或嵌套类,因此private方法可以特殊处理。该语言的后续版本是围绕JVM的。

在字节码术语中,private方法是用invokespecial而不是invokevirtual来调用的。

不同包中的默认access/package private final方法也是相互独立的。在同一个包中可以相互覆盖,final有所不同。在不同的包中,匹配的方法不会相互覆盖。

相关内容

  • 没有找到相关文章

最新更新