Java 为什么我得到的方法覆盖错误?
这是我的超类:Java 为什么我得到的方法覆盖错误?,java,compiler-errors,method-hiding,Java,Compiler Errors,Method Hiding,这是我的超类: class Superclass { int a=89; final static void m( int p){ System.out.println("Inside superclass"); } static void n(){ system.out.print("superclass"); } } 这是我的子类:: class Subc
class Superclass {
int a=89;
final static void m( int p){
System.out.println("Inside superclass");
}
static void n(){
system.out.print("superclass");
}
}
这是我的子类::
class Subclass extends Superclass {
int a=90;
static void m( int p){
System.out.println("Inside subclass");
}
static void n(){
system.out.print("subclass");
}
}
主要类别:
class main {
public static void main(String[] args) {
Subclass.m(89);
new Subclass().n();
}
}
问题是,我无法理解为什么Javac在静态方法中给了我覆盖错误。一个p.S plzz详细说明了所有覆盖规则对于隐藏也是有效的。像
新方法定义必须具有相同的方法签名(即。,
方法名称和参数)和相同的返回类型。是否
重写方法中的参数在
子类方法签名的自由裁量权不包括
参数的最终修饰符,仅限于其类型和顺序
新的
方法定义不能缩小方法的可访问性,但
新方法定义只能指定全部或全部
无,或异常类的子集(包括其
子类)中重写的方法的throws子句中指定
超类
我的错误是:
运行:
线程“main”java.lang.RuntimeException中的异常:不可编译
源代码-javaapplication3中的m(int)。子类不能重写
javaapplication3中的m(int)。超类重写方法为
静态,最终版本为javaapplication3.Subclass.m(javaapplication3.java:18)
在javaapplication3.min.main(javaapplication3.java:25)中,java结果:1
我还想问,当扩展超类的子类隐藏方法时,是否从classname调用静态成员来解析执行方法的哪个版本
如果我创建匿名对象,然后调用方法,那么编译器如何确定应该调用哪个版本的方法呢。
在上面主类i中的代码中,键入以下内容:新的子类().n()
即使我没有提供引用变量的类型,编译器如何知道应该调用方法的子类版本
方法可以声明为final,以防止子类重写或隐藏它
当从子类的实例调用具有相同父类签名的静态方法时。但是,您不能覆盖/隐藏。
关键字
final
将禁止隐藏该方法。因此它们不能被隐藏,尝试这样做将导致编译器错误。关于这一点,有一个很好的解释。你在这里观察到的情况与以下陈述一致:
试图覆盖或隐藏最终版本是编译时错误
方法。
您试图重写子类中的
final static void m
方法,这是Java编译器不允许的。您不能重写final方法。Final声明不重写方法。@bzzzrd是正确的,您认为如何重写Final/sealed成员?这没有道理!!他试图超越或隐藏?@JaimeHablutzel他试图超越。这个概念存在吗?我认为静态方法不能仅仅隐藏就被覆盖。@JaimeHablutzel是的,你是对的。它藏起来了。我的缺点是,我把这个概念称为过度隐藏……)