2015-04-18 89 views
-2

在我印象中,超不能調用子類java.But今天我寫了這樣的代碼,這讓我感到困惑......請幫幫我!謝謝超類可以調用子類

package CW; 

public class A extends B { 
    int a =100; 
    public A(){ 
     super(); 
     System.out.println(a); 
     a=200; 
    } 
    public static void main(String[] args) { 
     System.out.println(new A().a); 
    } 
} 
class B{ 
    public B(){ 
     System.out.println(((A) this).a); 

    } 
} 

是Java有這樣的語法嗎? ((A) this).a

超類可以調用子類。它允許嗎?

+3

是Java比C更安全,但它並不能完全防止你編寫錯誤的代碼。是的,編譯和運行,但如果你寫,'System.out.println(new B());'你會明白爲什麼鑄造充其量是棘手的,最糟糕的是直接危險。更大的問題是你爲什麼認爲該投射線不是或不應該是有效的Java? –

+1

如果不允許,這將不會編譯和運行。 –

+1

您將它投射到'A',所以您可以從那裏調用方法。這確實是可能的,但是你最好先檢查'A'的這個實例是否屬實。 – Bubletan

回答

2

我認爲你的主要困惑是由於一些鑄造錯誤在編譯時沒有被識別出來,而只是在運行時才能識別出來,這就是爲什麼鑄造最多可能很棘手並且最糟糕時最危險。僅僅因爲代碼將被編譯並不意味着它是安全的。例如,如果你把它放在你的主要方法中:

System.out.println(new B()); 

你的程序會編譯但會崩潰。

此代碼:

((A) this).a 

蒙上任何對象this表示到編譯作爲一個目的,並且被允許,因爲編譯將使雙方向上鑄造和下鑄造。它可以是或不是實際上是在運行時的A型,但是編譯器將它允許由於作爲配製在section 5.5 of the JLS鑄造規則:

鑑於編譯時引用類型S(源極)和一個編譯時引用類型T(目標),如果由於以下規則而沒有發生編譯時錯誤,則從S到T存在一個轉換轉換。

如果S是一個類類型:

  • 如果T是一個類類型,那麼無論| S | <:| T |或者| T | <:| S |。否則,會發生編譯時錯誤。