它打印什么?爪哇

时间:2018-09-08 10:40:56

标签: java

我对要求您写程序打印内容的练习有疑问。

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?

1 个答案:

答案 0 :(得分:1)

  

强制转换X x =(B)y不会创建具有静态类型“ X”和动态类型“ B”的变量x?

否。

我想用“静态类型”来表示编译器看到的类型,而“动态类型”是运行时对象的实际类型。

铸造纯粹是编译时的事情,因此它不会影响运行时类型(用您的话来说是动态类型)。投射基本上是说

  

“嘿,编译器,我断言该对象y的类型将在运行时转换为B,因此也请像编译时一样对待它”

在此,强制转换表达式(B)y的计算结果为类型B,然后将其隐式转换为X,因为您已将其分配给x

因此,x的编译时间类型为X,但是运行时类型与y的运行时类型相同,为C