是否在子类中重新定义非静态方法,但一切都相同,但静态覆盖或隐藏它?
http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html说隐藏。但是当我将超类方法声明为 final 时,我得到一个覆盖错误。
超类声明是
final static void display() { ... }
子类:
void display() { ... }
给出覆盖错误。
是否在子类中重新定义非静态方法,但一切都相同,但静态覆盖或隐藏它?
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 认为它是错误的。实例方法是否为最终方法无关紧要;静态方法是在基类中还是在派生类中也无关紧要:Java 将其称为错误。
但是,“不能覆盖”的编译器消息具有误导性:我认为“名称冲突”对于这种情况来说是一个更好的名称,因为“覆盖”是为具有两个实例方法的情况保留的。
您描述的方法是实例方法,而不是静态方法。您不能隐藏实例方法,只能隐藏静态方法。声明的实例方法final
不能在子类中被覆盖,这就是您要尝试做的事情。
final static void display() { ... }
上述方法具有非访问修饰符 final
,并且已生成的方法final
不能被覆盖。
你怎么能覆盖一个最终的方法。
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
}
}