2015-12-03 61 views
0

我有兩個班在Java中繼承的Java超類和類型轉換

Class A { void method1(){} } 
Class B extends A { void method2(){} } 

當我運行以下正常工作:

Class C { 
    public static void main(String [] args){ 
    A a1 = new A(); 
    A a2 = new B(); 
    B b1 = new B(); 
    ((B)a2).method2(); 
    } 
} 

但爲什麼下面不工作?

Class C { 
    public static void main(String [] args){ 
    A a1 = new A(); 
    A a2 = new B(); 
    B b1 = new B(); 
    (B)a2.method2(); 
    } 
} 

感謝

+0

你試圖投什麼是返回值。 –

回答

1

像卡比爾說,你需要調用從另一個對象的方法之前,首先投的對象。

這是因爲Java讀取你的第二個語句爲: (B) (a2.method2();)

所以Java試圖在A對象A2使用方法二,但不能因爲存在這樣的對象沒有method2()

然而,當你鍵入施放它(通過把括號A2之前(B)),它讀取它想:

(Turn a2 into B).method2();

這是因爲它是轉A2到B,運行良好,其包括方法2,事先。

在與數學概念的簡單對比中,它就像您計算值的操作順序。你不會說5 + 5 * 2 = 20,你會說5 + 5 * 2 = 15,因爲它首先計算5 * 2,然後添加5

+0

謝謝,現在很清楚 – thepiyush13

+0

不客氣! –

1

你必須在鑄造後要調用的方法。你需要圍繞A2即括號

((B)a2).method2(); 
+0

但爲什麼?因爲這兩個聲明都將其轉換爲B – thepiyush13