2013-04-27 46 views
0

尽管这是一个新手问题,但我对如何读取变量的值感到困惑?初始化时读取变量

int a = 7; 

它会从左到右还是从右到左?

也这样:

//X is a supper class of Y and Z which are sibblings. 
public class RunTimeCastDemo { 

    public static void main(String args[]) { 
      X x = new X(); 
      Y y = new Y(); 
      Z z = new Z(); 
      X xy = new Y(); // compiles ok (up the hierarchy) 
      X xz = new Z(); // compiles ok (up the hierarchy) 
      //  Y yz = new Z(); incompatible type (siblings) 
      //  Y y1 = new X(); X is not a Y 
      //  Z z1 = new X(); X is not a Z 
      X x1 = y; // compiles ok (y is subclass of X) 
      X x2 = z; // compiles ok (z is subclass of X) 
      Y y1 = (Y) x; // compiles ok but produces runtime error 
      Z z1 = (Z) x; // compiles ok but produces runtime error 
      Y y2 = (Y) x1; // compiles and runs ok (x1 is type Y) 
      Z z2 = (Z) x2; // compiles and runs ok (x2 is type Z) 
      //  Y y3 = (Y) z;  inconvertible types (siblings) 
      //  Z z3 = (Z) y;  inconvertible types (siblings) 
      Object o = z; 
      Object o1 = (Y) o; // compiles ok but produces runtime error 
     } 
    } 

我不明白怎么超=新子类阅读

X xy = new Y(); // compiles ok (up the hierarchy) 
    X xz = new Z(); // compiles ok (up the hierarchy) 

(它为什么会成为了层次,如果X是他们的超?它应该不会下降吗?)

+0

拇指规则是您始终可以使用超类型变量来引用子类型对象。 – 2013-04-27 20:14:28

+0

它是如何读取的?你有两种选择:a = 7或者7 = a。在Java中,你不能重新分配一个原始整数,所以只有一种方法有意义,不是吗? – 2013-04-27 20:20:21

+0

谢谢@DaveNewton但如果你正在处理变量的对象赋值?做同样的事情吗? EX: 超类X =子类Y; 是否可以读取为X =子类Y 或Y =超类X? – 2013-04-27 20:24:16

回答

2

...如何读取变量的值?

对于=(赋值)操作,将评估右侧的值并将其存储到左侧的变量中。因此,在您的示例中,首先评估7并将其存储到a中。如果右侧更加复杂,则将其存储在左侧的变量中之前将从左到右进行评估。

如果X是它们的超类,为什么它会在层次结构中?它不应该下降吗?

允许将子类存储为其超类,因为子类实现了超类的所有功能。因此,如果X定义方法Test(),并且YX的子类,那么Y也实现该方法。因此,您可以使用Y的实例,并将其存储在输入为X的变量中,因为所有X的功能都在Y中可用。

+0

没问题,那确实给我澄清了,但是,我对此有点困惑:(回头看上面的代码) X xy = new Y(); //编译好(在层次结构中) 当xy是'type'X但是指向对象Y时,它是什么意思? xy可以访问对象Y的所有方法还是需要强制转换? – 2013-04-27 20:22:53

+0

对于'X xy = new Y()',因为'xy'是'X'类型,所以不能在没有转换的情况下调用'xy.YMethod()'。 'Y'对象在被存储到'X'变量时没有被修改,但是这种情况是必需的,因为你也可以这样做,例如'X xy = new Z()',其中'Z'也是一个'X'的子类。如果您尝试运行'((Y)xy).YMethod()',则由于对象本身是'Z',所以投射失败。所以我有点啰嗦,但总之,是的,如果一个对象被存储为超类型,那么如果需要访问任何子类型的方法,则需要将其转换为子类型。 – 2013-04-27 20:27:03

+1

这个答案有帮助 – 2013-04-27 20:35:38