2013-04-27 93 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