Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何强制转换以运行超类方法_Java - Fatal编程技术网

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](链接)