这是我的代码

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中使用最终的mdifer,程序都可以编译并运行。

我可以理解,没有final修饰符,A1.A12可以看到并因此覆盖fun方法。它是私有的,但它们属于同一类,因此不存在可见性问题。

我不明白为什么它与final修饰符一起使用。不应禁止在A1.A12中进行覆盖吗?

这是带有最终修饰符的程序的输出

java alpha/A1
A11:    HelloHello


如果只是忽略了另一个有趣的方法,那么


编译器不会抱怨超级参考
A11将不在输出中

最佳答案

您的方法是私有的。

将其可见性更改为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

关于java - 最终修饰符的异常行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6863558/

10-11 22:52