2014-07-18 130 views
-1

我覺得輸出是直的2 child 2,但它原來是child 1 2 ???在java中繼承變量和方法

由於家長指向孩子,應該使用孩子的變量和方法,但是在孩子的字符串後面打印1。爲什麼字符串在s.i之前打印?以及爲什麼它指的是我父母的副本?

這裏是我的示例代碼:

public class Abc 
{ 
    int i=1; 
    public int getStr() 
    { 
    system.out.print("parent"); 
    return i; 
    } 
    public static void main(int[] a) 
    { 
    Abc s = new child(); 
    system.out.print(s.i + " " + s.getStr()); 
    } 
} 

class child 
{ 
    int i=2; 
    public int getStr() 
    { 
    system.out.print("child"); 
    return i; 
    } 
} 
+4

這看起來不像有效的java例如'psv ma​​in()'''''''''system.out.print()'。爲我們提供可運行的代碼。 – csmckelvey

+0

你能提供一個可行的例子嗎? –

+1

這段代碼不會編譯... dopes'child' extends'Abc'? – ApproachingDarknessFish

回答

2

我在這裏假定您的意思是child擴展Abc,而「psv」表示public static void。另外,我假設Class Abc確實是class Abcsystem.out.print確實是System.out.print(資本化問題)。

main中,創建了新的child並將其分配給Abc參考。 JVM必須先將表達式參數評估爲System.out.println,然後再將它傳遞給方法。

s.i靜態解析爲Abci,或1 - 沒有多態性與變量,只有方法。

評估然後調用getStr()child類將覆蓋getStr(),因此它首先打印child,並在範圍內返回i - 2

返回main,表達式評估結束 - 1加空格加2。因此,在已經打印的child之後立即打印表達式。

child1 2 
+0

嘿,非常感謝...所以你的意思是方法調用將被評估第一,然後變量將被解決? – user1079065

+0

我清理了我的解釋。 – rgettman

1

假如孩子不延長ABC,做出一個改變。不要聲明我在孩子身上,只是從Abc繼承而來。換句話說,兒童,改變

int i=2; 

i=2; 

注意:您將需要把這個在構造函數中。你在做什麼是造成各種混亂的陰影。 This post provides a nice example, very close to your question.

+0

謝謝..這正是我正在尋找的...再次感謝 – user1079065

+2

嗯......如果你只是改變它爲'i = 2'它不會編譯,因爲你現在有一個聲明不是部分的一種方法。 – ajb

+0

把它放在構造函數中。它不像OP有史以來的代碼。 :-) – user949300

0

爲了解決地方"child"在輸出中出現的問題:呼叫

System.out.print(s.i + " " + s.getStr()); 

一樣

System.out.print(s.i); 
System.out.print(" "); 
System.out.print(s.getStr()); 

在第一種情況下,該方案具有在打印任何內容之前首先計算整個輸出字符串,通過計算三個零件並創建一個連接的字符串。然後它打印出來。它不會一次打印三個部分(第二個示例的方式)。所以在計算字符串時,它會調用getStr(),它將首先打印"child"。這就是爲什麼"child"出現在"1 2"之前的輸出中。