2016-03-01 44 views
0

我執行了下面的程序,我很好奇我得到的輸出是哪個函數輸出先打印出來的,即使它是我首先打印的變量。爲什麼Overrided函數首先被調用?

class Baap{ 

    public int h = 4; 
    public int getH(){ 
     System.out.println("Baap "+h); return h; 
    } 

} 

public class Beta extends Baap{ 

    public int h = 44; 
    public int getH(){ 
     System.out.println("Beta "+h); return h; 
    } 
    public static void main(String args[]){ 
     Baap b = new Beta(); 
     System.out.println(b.h+" "+b.getH()); 
     Beta bb = (Beta)b; 
     System.out.println(bb.h+" "+bb.getH()); 
    } 

} 

輸出結果如下

Beta 44 
4 44 
Beta 44 
44 44 

有人可以幫我明白爲什麼功能塊最先被執行?

+0

@Nambari,那不是他所指的。 – Dave

回答

4

您的System.out.println行打印String

String的在運行時作爲b.h + " " + b.getH()被評估,因此它串接b.h,空間和方法b.getH()的結果,因此它調用getH()它打印Beta 44,然後打印結果4 44

0

當您調用函數時,必須先評估其所有參數。在你的情況下,System.out.println的唯一參數是表達式b.h + " " + b.getH()

由於這仍然是一個表達式,下一步是評估該表達式,這意味着要確定表達式的值。它由2個有3個操作數的操作符組成。爲了評估加操作符,程序必須評估操作數的值。

b.h的值計算結果爲4,因爲變量是在Java中靜態解析的。變量b的類型是Baap所以我們得到4.
下一個值是" "這已經是一個文字,所以沒有什麼可做的。
之後,我們有函數調用b.getH()。 Java中的函數調用通常是虛擬的,所以我們實際上調用Beta類型的函數getH。此函數只能看到它自己的作用域,其中變量h在類Beta中聲明的「陰影」類Baap中聲明的變量,這意味着對Beta的每個成員隱藏h變量Baap
評價函數調用,我們必須執行它打印「貝塔44」和返回值44

現在,我們已經爲所有的3個操作員我們可以評估與+運營商的表情值的功能。這導致字符串「4 44」現在被傳遞給System.out.println並最終打印在屏幕上。

+0

謝謝。瞭解。 – eccentricCoder

相關問題