我对要求您写程序打印内容的练习有疑问。
interface X { public void f(); }
interface Y { public char g(); }
class A implements Y, Z {
public void f() { System.out.print("A.f() "); }
public char g() { System.out.print("A.g() "); return 'A'; }
public void h() { System.out.print("A.h() "); }
public void m() { System.out.print("A.m() "); }
}
class B implements X {
public void f() { System.out.print("B.f() "); }
}
class C extends B implements Y {
public void f() { System.out.print("C.f() "); }
public char g() { System.out.print("C.g() "); return 'C'; }
}
public class Print{
public static void main (String args[]) {
Y y = new C();
X x = (B)y;
x.f();
y.g();
System.out.println("End!");
}
}
我的疑问是,为什么x.f()打印C.f()而不打印B.f。
强制转换X x = (B)y
是否创建具有静态类型“ X”和动态类型“ B”的变量x?
答案 0 :(得分:1)
强制转换X x =(B)y不会创建具有静态类型“ X”和动态类型“ B”的变量x?
否。
我想用“静态类型”来表示编译器看到的类型,而“动态类型”是运行时对象的实际类型。
铸造纯粹是编译时的事情,因此它不会影响运行时类型(用您的话来说是动态类型)。投射基本上是说
“嘿,编译器,我断言该对象
y
的类型将在运行时转换为B
,因此也请像编译时一样对待它”
在此,强制转换表达式(B)y
的计算结果为类型B
,然后将其隐式转换为X
,因为您已将其分配给x
。
因此,x
的编译时间类型为X
,但是运行时类型与y
的运行时类型相同,为C
。