2016-09-22 51 views
0

所以我一直在研究抽象類和動態綁定,並決定測試幾個例子。抽象類和動態綁定

我有以下3個類:AbstractDemo(main),MyAbstract和MySubAbstract。主要方法是使用動態或靜態綁定從兩個類中調用方法。

除了最後一個我嘗試使用動態綁定並調用僅在子類(sub1())中定義的方法之一以外的所有以下調用都起作用。我假設儘管被超類的引用聲明,對象仍然能夠找到在該對象的類中聲明的方法。

有人可以解釋爲什麼嗎?

public abstract class MyAbstract { 
public abstract void abs1(); 
public abstract void abs2(); 

public void nonAbs1() { 
    System.out.println("MyAbstract nonAbs1"); 
} 

public void nonAbs2() { 
    System.out.println("MyAbstract nonAbs2"); 
} 
} 


public class MySubAbstract extends MyAbstract { 

public void abs1() { 
    System.out.println("MySubAbstract abs1()"); 
} 

public void abs2() { 
    System.out.println("MySubAbstract abs2()"); 
} 

public void sub1() { 
     System.out.println("MySubAbstract sub1()"); 
} 

public void sub2() { 
     System.out.println("MySubAbstract sub2()"); 
} 

public void nonAbs1() { 
     System.out.println("MySubAbstract nonAbs1()"); 
} 
} 


public class AbstractDemo { 

public static void main(String[] args) { 
    MySubAbstract a = new MySubAbstract(); a.abs1(); 
    MySubAbstract b = new MySubAbstract(); b.sub1(); 
    MySubAbstract c = new MySubAbstract(); c.nonAbs2(); 
    MySubAbstract d = new MySubAbstract(); d.nonAbs1(); 
    MySubAbstract e = new MySubAbstract(); e.nonAbs2(); 
    MyAbstract f = new MySubAbstract(); f.abs1(); 
    MyAbstract g = new MySubAbstract(); g.nonAbs1(); 
    MyAbstract h = new MySubAbstract(); h.sub1(); 
    } 
} 
+0

的[調用從父類對象的子類中的方法]可能的複製(http://stackoverflow.com/questions/11466441/call-a-child-class-method-from -a-parent-class-object) –

回答

1

MyAbstract H =新MySubAbstract(); h.sub1();

這將創建和對象MySubAbstract並將其存儲在MyAbstract類型的引用,這意味着,除非你將其丟((MySubAbstract) h)你只能調用從MyAbstract方法。

看到polymorphism作爲爲例

+1

這將創建一個MySubAbstract類型的對象,並將其存儲在MyAbstract類型的引用(或變量)中(而不是對象)。 –

+0

我想我並不真正瞭解發生了什麼。謝謝! – rmettig

+0

@DavideLorenzoMARINO你說得對,我在快速解釋。我編輯了這部分 –

2

從你的代碼h被聲明爲MyAbstract,所以沒有一個明確鑄造你只能訪問MyAbstract(既抽象又具體方法)聲明的方法。

要調用sub1()你需要投它

MyAbstract h = new MySubAbstract(); 
((MySubAbstract) h).sub1();