有没有办法使用强制转换,以便在m1()
类中运行I1
方法来打印In I1 class
?我不希望它运行重写方法。
class TestClass extends I1 implements I2{
public void m1() { System.out.println("Hello"); }
public static void main(String[] args){
I1 tc = new TestClass();
tc.m1();
}
}
class I1{
int VALUE = 1;
public void m1(){System.out.println("In I1 class");}
}
interface I2{
int VALUE = 2;
void m1();
}
答案 0 :(得分:2)
不,你不能这样做。多态性的部分原因是能够隐藏层次结构中较低级别的实现细节。您可以调用超类方法,但仅作为重写方法内的调用。
这样想。也许TestClass
在方法m1
内做了一些重要的事情,它保持其内部状态并保持一致。也许它跟踪在超类中完成的事情,并维护自己的缓存,或复制或类似。如果你可以让它调用超类方法,那么代码就不会运行,你就会严重破坏TestClass
。
您评论中的建议
的原因((I1)tc).m1();
不起作用是您已更改正式类型,而不是实际类型。在运行时调用重写方法基于实际类型,因此JVM仍会注意到它是TestClass
类型,并调用重写方法。
答案 1 :(得分:0)
您首先声明了I1 tc = new TestClass()
,所以即使您((I1)tc).m1()
,tc
仍然指向TestClass()
的对象。这就是为什么它不起作用。
如果您想从m1()
课程致电I1
,请改为I1 tc = new I1();
。