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的方法