是在子类中重新定义一个非静态方法,它具有相同的一切,但是作为静态覆盖或隐藏它?
http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html说隐藏。但是当我将超类方法声明为final时,我得到一个覆盖错误。
超类声明是
final static void display() { ... }
子类:
void display() { ... }
给出覆盖错误。
答案 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
的方法。