这个问题在这里已经有答案了:
转换为超类,并调用重写的方法(4个答案)
如果我将一个子类转换为它的超类,并调用一个在子类中被重写的方法,它执行的是被重写的方法还是原始方法(5个答案)
如果我完成了强制转换,为什么要重写从子类调用的方法(3个答案)
两天前关门了。
当涉及到强制转换时,继承是如何工作的(在java中)?casting与示例变量一样工作,但与方法不同。
给定以下代码;课堂上的评论 C
指编译器通过查看字节码可以检查的分辨率。
class A {
String name;
void test1() {
System.out.println("ATest1 =" + this);
}
void test2() {
System.out.println("ATest2 =" + this);
}
}
class B extends A {
String name;
void test1() {
System.out.println("BTest1 =" + this);
}
void test3() {
System.out.println("BTest3 =" + this);
}
}
class C {
static public void main(String... args) {
B b = new B();
b.name = "Peter"; // Field B.name
((A)b).name = "Petra"; // Field A.name
System.out.println(b.name);
System.out.println(((A)b).name);
b.test1(); // Method B.test1(b)
((A)b).test1(); // Method A.test1(b)
b.test3(); // Method B.test3(b)
b.test2(); // Method B.test2(b)
}
}
你可以使用铸造来设置 name
在示例中 b
以及设置 name
在其附带的“虚拟”对象中,类的示例 A
可以这么说。
但是,如果涉及方法,则调用总是解析为示例 b
打电话 test1
在课堂上 B
. 尽管事实上 ((A)b).test1()
方法 A.test1(b)
(从jvm的Angular )被调用。
我不懂语义学。你能帮忙吗?
我猜是这样的 ((A)b).test1()
确认方法的存在 test1
在课堂上 A
. 尽管如此,阶级 B
是调用方法时方法解析的起点,因为 ((A)b).getClass() ==> class B
. 但为什么选角被“忽略”?你有java语言规范的指针吗?我不知道去哪儿找。
暂无答案!
目前还没有任何答案,快来回答吧!