java非静态到静态方法 - 隐藏或覆盖

时间:2012-11-19 04:55:25

标签: java method-overriding method-hiding

是在子类中重新定义一个非静态方法,它具有相同的一切,但是作为静态覆盖或隐藏它?

http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html说隐藏。但是当我将超类方法声明为final时,我得到一个覆盖错误。

超类声明是

final static void display() { ... }

子类:

void display() { ... }

给出覆盖错误。

5 个答案:

答案 0 :(得分:5)

  

是否在子类中重新定义了一个非静态方法,除了静态覆盖或隐藏它之外的所有内容都相同?

它既不是,因为这样做会触发compilation error,导致程序无效。

class A {
    void x();
}
class B extends A {
    // ERROR!!!
    static void x();
}

当对中的两个方法都是静态方法时,会发生隐藏;当对中的两个方法都是实例方法时,会发生重写。当其中一个是静态方法而另一个是实例方法时,Java认为它是一个错误。实例方法是否为final是无关紧要的;如果静态方法在基类或派生类中也无关紧要:Java无论如何都将其称为错误。

但是“无法覆盖”的编译器消息具有误导性:我认为“名称冲突”对于这些条件来说是一个更好的名称,因为“覆盖”是为具有两个实例的情况保留的方法。

答案 1 :(得分:3)

您描述的方法是实例方法,而不是静态方法。您无法隐藏实例方法,只能隐藏静态方法。声明final的实例方法无法在子类中重写,这就是您要做的事情。

答案 2 :(得分:0)

如何覆盖最终的方法。

最后的方法永远不能在子类中重写。

那是编译错误..

答案 3 :(得分:0)

你无法覆盖最终方法......

例如:

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
  }
}

答案 4 :(得分:0)

final static void display() { ... }

上述方法具有非访问修饰符 final,并且无法覆盖已设置final 的方法。