java非静态到静态方法 – 隐藏或覆盖
是在一个子类中重新定义一个非静态方法,它具有相同的一切,但是作为静态覆盖或隐藏它?
http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html表示隐藏。 但是当我将超类方法声明为final时,我得到一个覆盖错误。
超类声明是
final static void display() { ... }
子类:
void display() { ... }
给出覆盖错误。
是在一个子类中重新定义一个非静态方法,它具有相同的一切,但是作为静态覆盖或隐藏它?
它既不是,因为这样做会触发编译错误 ,导致程序无效。
class A { void x(); } class B extends A { // ERROR!!! static void x(); }
当对中的两个方法都是静态方法时,会发生隐藏; 当对中的两个方法都是实例方法时,会发生重写。 当其中一个是静态方法而另一个是实例方法时,Java认为它是一个错误。 实例方法是否为final是无关紧要的; 如果静态方法在基类或派生类中也无关紧要:Java无论如何都将其称为错误。
但是,“无法覆盖”的编译器消息具有误导性:我认为“名称冲突”对于这些条件来说是一个更好的名称,因为“覆盖”是为具有两个实例方法的情况保留的。
您描述的方法是实例方法,而不是静态方法。 您无法隐藏实例方法,只能隐藏静态方法。 声明为final
的实例方法无法在子类中重写,这正是您尝试执行的操作。
如何覆盖最终的方法?
最终的方法永远不会在子类中被覆盖。
那是编译错误..
你不能覆盖最后的方法……
例如:
class Super { final void display() { //do something } void show() { //Do Something } } class Sub extends Super { //Not Valid hence Compile Error void display() { //do something } //Valid void show() { //Do Something } }
final static void display() { ... }
上述方法具有非访问修饰符 final
,并且不能覆盖已经final
的方法。