Java 如何强制转换以运行超类方法
是否有一种方法可以使用强制转换,以便在Java 如何强制转换以运行超类方法,java,Java,是否有一种方法可以使用强制转换,以便在I1类中运行m1()方法来打印I1类中的?我不希望它运行重写的方法 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(
I1
类中运行m1()
方法来打印I1类中的?我不希望它运行重写的方法
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();
}
您首先声明了i1tc=newtestclass()
,因此即使您声明了((I1)tc)。m1()
,tc
仍然指向TestClass()的对象。这就是它不起作用的原因
如果要从I1
类调用m1()
,应该执行i1tc=newi1()代码>。不,你不能这样做。多态性的一部分是能够对层次结构中较低的类隐藏实现细节。您可以调用超类方法,但只能作为重写方法内部的调用
这样想吧。也许TestClass
在方法m1
中做了一些重要的事情,以保持其内部状态并保持一致。也许它会跟踪在超类中完成的事情,并维护自己的缓存、副本或类似内容。如果您能让它调用超类方法,那么代码将无法运行,您将严重破坏TestClass
你在评论中提到这个建议的原因是什么
((I1)tc).m1();
不起作用的是,您更改了正式类型,但没有更改实际类型。重写方法的调用基于运行时的实际类型,因此JVM仍然会注意到这是类型TestClass
,并调用重写方法。我认为((I1)tc).m1();可以,但它仍然打印“Hello”不,这将是一个很大的安全漏洞。类似的问题解释为什么super.super
也是不可能的:你不能这么做。[这里][1]是原因的解释。[1] :@MateuszKorwel发现得不错。无论如何,如果您想在评论中发布链接,只需使用[description](链接)
。