2011-05-14 75 views
4

我有一個父類。OOPS概念父類的調用函數不是子類

import java.util.HashMap; 
import java.util.Map; 


public class Parent { 

    Map<String,String> map = new HashMap<String, String>(); 


    public void process(){ 
     System.out.println("parent"); 
     this.checkFunction(); 
    } 

    protected void checkFunction(){ 
     System.out.println("parentC"); 
     System.out.println(map); 
    } 

    public void init(){ 
     (map).put("parent","b"); 

    } 
} 

現在,正如所料,我有一個孩子班。

import java.util.HashMap; 
import java.util.Map; 


public class Child extends Parent { 

    Map<String,String> map = new HashMap<String, String>(); 


    public void checkFunction(){ 
     System.out.println(map); 
     System.out.println("ChildC"); 

    } 

    public void process(){ 
     super.process(); 
     System.out.println("Child"); 

    } 

    public void init(){ 

     super.init(); 
     (map).put("child","b"); 

    } 
} 

爲了測試我想要的,我有一個主類。

public class test { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     Child a = new Child(); 
     a.init(); 
     a.process(); 
     Parent p = a; 
     p.checkFunction(); 
    } 

} 

當我打電話a.process(),我認爲它應該叫child.process()將在返回調用super.process()。到現在爲止還挺好。在父進程()中,它應該調用checkFunction()。

現在,根據我的理解,它應該調用父類的checkFunction()。爲什麼它調用Child的checkFunction()?

我的輸出是這樣

parent 
{child=b} 
ChildC 
Child 
{child=b} 
ChildC 

我希望它是

parent 
parentC 
{parent=b} 
Child 
{child=b} 
ChildC 
+1

調用'Child.checkFunction'是正確的。這是Java動態多態性的本質。調用'checkFunction'的目標對象是'Child'的一個實例,所以它的'checkFunction'的實現將被執行。 – 2011-05-14 01:18:53

回答

5

這是因爲你在子類中重寫checkFunction。因此即使調用來自父類,子實例也會調用子checkFunction。

如果你想從孩子的一個實例調用父母的checkfunction,你需要在子類中調用super.checkFunction()。 super關鍵字本質上是「向上移動」繼承鏈。

super關鍵字的詳細描述可以發現here

+0

謝謝@Ricick。我仍然不敢相信這是對的。這改變了我的一切。無論如何,我將如何從父級的類中調用父級的checkFunction()。通過重寫,我明白我稱呼孩子的功能不是父母的,但是當父母打電話時父母知道孩子的功能是什麼。請評論! – 2011-05-14 01:50:55

+1

基本上你不能。如果您想確保在子類中調用父方法,請不要覆蓋它。通過覆蓋你明確地說「我不想使用父方法」。 – ricick 2011-05-14 01:56:42

+0

只是爲了確認在父功能中的數據訪問將是父母而不是孩子的數據訪問。 (就像在上面的問題中一樣) – 2011-05-14 03:42:40