繁体   English   中英

公共final或受保护的final方法不会在基类中覆盖,而当我们在父类中将方法“ PRIVATE FINAL”用作其覆盖时

[英]public final or protected final method does not override in base class and when we make a method “PRIVATE FINAL” in parent class its override

在基类中不覆盖public finalprotected final方法很简单,当我们在父类中将方法private final ,即使您将父类private final并在其子类中使用protected final扩展,它也会被覆盖。 有人可以解释这种行为吗?

class A {

    private final void show() {
        System.out.println("Show method from A");
    }
}

class B extends A {

    protected final void show() {
        System.out.println("Show method from B");
    }

    public static void main(String... s) {
       new B.show();
    }
}

嗨,就像其他人说的那样,您误解了覆盖。 首先,类A中的show方法是私有的。 因此不能从该类的外部访问私有成员。下面的示例将说明这一点:

class A {
    private final void show() {
        System.out.println("Show method from A");
    }
}

public class B extends A {
    // protected final void show() {
    //     System.out.println("Show method from B");
    // }

    public static void main(String... s) {
        new B().show();
    }
}

如果您对此进行编译,则会出现以下错误:

B.java:12: error: cannot find symbol
        new B().show();
             ^
symbol:   method show()
location: class B
1 error

在您的问题中,它正在调用在类B中定义的方法“ show()”,而不是Ai希望这样可以澄清您的疑问。

您可以将某些或所有类的方法声明为final。 您可以在方法声明中使用final关键字,以指示该方法不能被子类覆盖。 Object类执行此操作-它的许多方法都是最终的。

如果方法的实现不应该更改并且对于对象的一致状态至关重要,则可能希望将其定型。

来自Java官方文档的声明。

如果您的代码是

A a = new B();
a.show();

然后,您将尝试从父类调用无法覆盖的方法。 由于在您的示例中这是私有的,因此您将无法使用它。 尝试使用公共方法。

所以发生的事情是,当对象的类型为B时,您的B.show()方法将掩盖A.show()-这始终是事情的工作方式。 当您的引用是父类的类型时,覆盖方法有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM