2013-12-10 63 views
2

重寫時會有什麼執行流程?我相信的是,當我們調用任何類的構造函數/對象時,在執行時首先調用父構造函數而不是子進程。但在過度消除的情況下會發生什麼? 讓假設:Java執行流程?

class A { 
    public A(){ 
     printStatus(); 
    } 

    public void printStatus(){ 
     System.out.println("In Class A"); 
    } 
} 

class B extends A{ 

    public B(){ 
     printStatus(); 
    } 

    @Override 
    public void printStatus(){ 
     System.out.println("In Class b"); 
    } 

} 

public class Test2 { 
    public static void main(String[] args){ 
     B b = new B(); 
    } 
} 

出把這段代碼是:

In Class b 
In Class b 

我不明白的是,爲什麼它的打印「在課堂上」而已,它應該是「在A級和,在類b「,
當我從類b中刪除重寫方法。它給了我想要的輸出。

+0

請格式化你的代碼 – david99world

回答

3

所有java方法都是虛擬的。這意味着使用實際類型這個調用該方法。因此,在構造函數A(){} 之內,這個是B的實例,所以這就是爲什麼你有它的方法調用。

2

這樣調用printStatus()會調用同一個類的方法。如果你打電話給super.printStatus()它會從超類(你擴展的類)中調用方法。

2

當你超越一種方法時,你會完全超越它。原始實現的存在對其他類是完全不可見的(除了通過反射之外,這是它自己的一個重要話題,並且不是真正相關的)。只有你自己的類可以訪問原始方法,那就是調用super.methodName()。

請注意,您的類可以在任何地方調用super.methodName(),而不僅僅是在重寫函數中,儘管如果您希望超級實現和自己一樣運行,最常用的用法是在重載函數中。

構造函數是一個稍微特殊的情況,因爲有規則說明如何調用構造函數以及爲什麼要調用構造函數以確保在嘗試在繼承類中使用它時完全初始化超類。

1

super是總是調用是否寫入super();或不。

在這個例子中,類A的printStatus()方法永遠不會被調用。由於您正在創建B類的實例,因此將會覆蓋方法。您可以使用以下方法調用Class A的printStatus()方法。

public B() 
{ 
    super.printStatus(); 
} 
0

當你重寫的方法,它將覆蓋你從A類

0

想到應該用super關鍵字調用父類的方法之一。

class A { 
    public A(){ 
     printStatus(); 
    } 

    public void printStatus(){ 
     System.out.println("In Class A"); 
    } 
} 

class B extends A{ 

    public B(){ 
     super.printStatus(); 
    } 

    @Override 
    public void printStatus(){ 
     System.out.println("In Class b"); 
    } 

} 

構造函數調用public B(){ super.printStatus(); } A類印刷方法和構造函數調用public A(){ printStatus(); } B類打印的方法,因爲你覆蓋。

但是它的錯誤與overridable method calls in constructors

0
Try with like this : 

class A { 
    public A(){ 
     printStatus(); 
    } 

    public void printStatus(){ 
     System.out.println("In Class A"); 
    } 
} 

class B extends A{ 

    public B(){ 
     super.printStatus(); 
     printStatus(); 
    } 

    @Override 
    public void printStatus(){ 
     System.out.println("In Class b"); 
    } 

} 

public class Test2 { 
    public static void main(String[] args){ 
     B b = new B(); 
    } 
} 

爲了更好地理解超載和壓倒一切只是通過這個鏈接的概念:

http://en.wikibooks.org/wiki/Java_Programming/Overloading_Methods_and_Constructors