3

是否在子类中重新定义非静态方法,但一切都相同,但静态覆盖或隐藏它?

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

超类声明是

final static void display() { ... }

子类:

void display() { ... }

给出覆盖错误。

4

5 回答 5

7

是否在子类中重新定义非静态方法,所有内容都相同,但静态覆盖或隐藏它?

两者都不是,因为这样做会触发编译错误,从而使您的程序无效。

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

当对中的两个方法都是静态方法时,就会发生隐藏;当对中的两个方法都是实例方法时,就会发生覆盖。当两者之一是静态方法而另一个是实例方法时,Java 认为它是错误的。实例方法是否为最终方法无关紧要;静态方法是在基类中还是在派生类中也无关紧要:Java 将其称为错误。

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

于 2012-11-19T05:20:12.977 回答
3

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

于 2012-11-19T04:57:08.240 回答
1

final static void display() { ... }

上述方法具有非访问修饰符 final,并且已生成的方法final 不能被覆盖。

于 2012-11-19T05:35:00.520 回答
0

你怎么能覆盖一个最终的方法。

final 方法永远不能在子类中被覆盖。

那是编译错误..

于 2012-11-19T05:24:30.037 回答
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
  }
}
于 2012-11-19T05:24:34.387 回答