Dug*_*ggs 2 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");
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的子类::
class Subclass extends Superclass {
int a=90;
static void m( int p){
System.out.println("Inside subclass");
}
static void n(){
system.out.print("subclass");
}
}
Run Code Online (Sandbox Code Playgroud)
主要类:
class main {
public static void main(String[] args) {
Subclass.m(89);
new Subclass().n();
}
}
Run Code Online (Sandbox Code Playgroud)
问题是我不明白为什么 Javac 在静态方法中给我覆盖错误..一个 PS plzz 详细说明所有覆盖规则对于隐藏也是有效的。喜欢
新的方法定义必须具有相同的方法签名(即方法名称和参数)和相同的返回类型。覆盖方法中的参数是否应该是 final 由子类方法的签名决定,不包含参数的 final 修饰符,只包含它们的类型和顺序。
新的
方法定义不能缩小方法的可访问性,但可以扩大方法的可访问性
我的错误是: 运行:
线程“main”中的异常 java.lang.RuntimeException: 不可编译的源代码 - javaapplication3.Subclass 中的 m(int) 不能覆盖 javaapplication3.Superclass 中的 m(int) 重写方法是静态的,最终在 javaapplication3.Subclass.m(JavaApplication3.java :18) 在 javaapplication3.min.main(JavaApplication3.java:25) Java 结果:1
我还想问一下,当方法被扩展超类的子类隐藏时,从类名调用的静态成员是否执行了哪个版本的方法如果我创建匿名对象然后调用方法,那么编译器如何确定应该调用哪个版本的方法. 在上面的主类代码中,我输入: new Subclass().n();
即使我没有提供引用变量的类型,编译器如何知道应该调用方法的子类版本
可以将方法声明为 final 以防止子类覆盖或隐藏它。
从子类的实例调用时,父类中具有相同签名的静态方法将被隐藏。但是,您不能覆盖/隐藏final methods。该关键字final将禁止隐藏该方法。因此它们不能被隐藏,并且尝试这样做会导致编译器错误。在Javaranch上对此有一个很好的解释。
| 归档时间: |
|
| 查看次数: |
2727 次 |
| 最近记录: |