2015-10-13 45 views
3
public class ExampleClass { 

    public static void main(String[] args) { 

     // Upcasting from subclass to super class. 
     A aRef=new C(); 

     //aRef.setMessage(); compilation Error  
     aRef.display(); 

     B bRef = (B)aRef; 
     //bRef.setMessage(); compilation Error 
     bRef.display(); 

     C cRef = (C)aRef; 
     cRef.setMessage("ayaz"); 
     cRef.display(); 
    } 
} 

interface A 
{ 
    void display(); 
} 

class B implements A 
{ 

    public void display() { 
     System.out.println("Am in class B"); 
    } 

} 

class C extends B 
{ 
    String msg = "Am in class C"; 
    @Override 
    public void display() { 
     System.out.println(msg); 
    } 
    public void setMessage(String s){ 
     msg = s; 
    } 

} 

在上面的代碼向下轉換AREF目的是B型無法調用setMessage(的目的後),儘管對調用具有BREF obj顯示,C類的顯示方法被調用。當我們貶低C的Obj時,我們可以打電話給爲什麼?是aRef只指向C類型的對象,我認爲引用不會被複制。向下鑄造對象並調用方法

回答

0

雖然駐留在堆中的對象是C類的,但您使用的引用是類型B.您只能調用引用中存在的方法,而不能調用實際對象中存在的方法。

1)唯一的類C具有setMessage method.So只有對象C的參考可以調用此method.Alternatively可以定義在接口和B類和標記B類爲抽象這些方法在C類中

一個具體的實施
public class ExampleClass { 

    public static void main(String[] args) { 

     // Upcasting from subclass to super class. 
     A aRef=new C(); 

     aRef.setMessage(); //No compilation Error now  
     aRef.display(); 

     B bRef = (B)aRef; 
     bRef.setMessage(); //No compilation Error now  
     bRef.display(); 

     C cRef = (C)aRef; 
     cRef.setMessage("ayaz"); 
     cRef.display(); 
    } 
} 

interface A 
{ 
    void display(); 
    void setMessage(String s); 
} 

abstract class B implements A 
{ 

    public void display() { 
     System.out.println("Am in class B"); 
    } 

} 

class C extends B 
{ 
    String msg = "Am in class C"; 
    @Override 
    public void display() { 
     System.out.println(msg); 
    } 
    public void setMessage(String s){ 
     msg = s; 
    } 

} 
2

兩件事情:

  • 編譯時編譯器着眼於引用的類型,以確定是否存在的方法(至少聲明)。因此aRef.display()正確爲bRef.display()cRef.display()。但aRef.setMessage()bRef.setMessage()是不正確的(setMessage是未聲明或AB中定義的方法,當然cRef.setMessage()是正確的。在運行時
  • 設備查找來執行正確的方法。作爲aRefbRefcRef指相同C對象重新定義了方法display,這一個被稱爲
0

的簡單的規則是:

  • 變量類型的講述可以做些什麼
  • 的對象的類型的告訴你如何做到這一點
+0

'類型的變量:'定義數據將如何表示和存儲。 '對象的類型:'通過方法來定義對象的行爲,本質上是使用特定對象可以執行的操作。 – YoungHobbit

+0

據我所知,變量的類型也定義了可以在被引用對象上使用的一組方法 –