2012-12-20 34 views
9

考虑:引用类型和对象类型更改Java

public class X implements Z { 
public String toString() { return "I am X"; } 
public static void main(String[] args) { 
    Y myY = new Y(); 
    X myX = myY; 
    Z myZ = myX; 
    System.out.println(myZ); 
} 
} 
class Y extends X { 
public String toString() { return "I am Y"; } 
} 

interface Z {} 

什么是MYZ的引用类型,什么是它引用的对象的类型? A.参考类型为Z;对象类型为Z.

B.引用类型为Y;对象类型为Y.

C.引用类型为Z;对象类型为Y.

D.引用类型为X;对象类型是Z.

在这种情况下,我知道对象类型肯定是Y,因为我可以使用.getClass()方法对其进行测试。但我不确定如何检查参考类型是什么。我假设它是Z但这个假设是基于直觉而不是逻辑。

任何人都可以详细说明引用类型可能是什么,为什么?

谢谢。

+0

我会去与C,对象是用新的Y()创建;并且myZ被声明为Z –

回答

4

的对象的类型的参考在其声明的点静态定义:

Z myZ = ... 

因此,基准的类型是Z,所以“C”应该是正确的答案。

+0

总体上参考类型的含义是什么?我们为什么需要它? –

+2

该引用声明该对象的接口。如果类型X有方法getA(),getB()和getC()。并且类型Y只有getA()和getB(),然后通过将接口(引用类型)从X更改为Y,即使对象类型为X,也只能访问getA()和getB()。 – NickL

2

的Object用new Y();创建这样的对象类型Y

myZ被宣布为ZZ myZ = ...;),所以引用类型是Z

因此,正确的答案是Ç

0

该对象以Z型为参考

Z myZ = myX; 

其实本来是为Y型创建,

Y myY = new Y(); 

因此,ANS显然是C.

0

我知道那是因为标记为真正的一个错误答案的混乱;我也遇见过它。事实是,正如他们所说,引用是类型Z,对象类型是Y,所以C是正确的答案。