2013-08-20 26 views
-2

任何人都可以告訴我爲什麼輸出是82而不是92?方法調用後不會增加的Int實例變量

public class practice { 
    int squares = 81; 
    public static void main(String[] args) { 
     new practice().go(); 
    } 

    void go() { 
     incr(++squares); 
     System.out.println(squares); 
    } 

    void incr(int squares) { 
     squares += 10; 
    } 
} 
+0

您無法通過方法的參數修改原始類型。如果你使用'this.squares + = 10;'而不是'square + = 10;' –

+0

Java是通過值的。想一想。 –

回答

2

原因squares仍然是82範圍。一旦incr函數被調用,squares是82,然後函數獲取變量的本地副本。

它的本地副本會增加10,然後在函數結束時超出範圍。控制然後返回到go函數,其中正方形沒有增加10.

然後它將其打印出來。

如果你這樣做:

public class practice { 

int squares = 81; 
public static void main(String[] args) { 
    new practice().go(); 
} 

void go() { 
    incr(++squares); 
    System.out.println(squares); 
} 

void incr(int squares) { 
    squares += 10; 
    System.out.println(squares); 
} 
} 

你會再看看

92 
82 

作爲輸出。

+2

作爲堆棧中的值類型,它實際上不需要GC'd。 – kiheru

+0

非常感謝你:) –

8
void incr(int squares) { 
     squares += 10; 
    } 

squares在這裏參數名稱將隱藏實例變量。所以,+發生在參數變量上,而不是實例變量上。

使用this.squares如果你想操作實例變量(incr(...)是實例方法)。

+0

+1 for thissquares –

5

你前加squares這裏:

incr(++squares); 

所以82到incr傳遞。但incr收到其局部變量squares中的值82的副本。該副本被修改,但原始內容未被修改。在incr中,名稱squares引用本地變量,而不是實例變量。所以,早在gosquares仍然是82

要獲得92,所有你需要做的是squares參數重命名爲任何其他合法的標識符(比如,_squares,或square,或foo),使squares在方法的主體中會引用實例變量,而不是參數。

(當然也有其他的方式,比如在incrthis.squares += 10;,或incr返回squaresgo結果分配給squares

1

你不把它發送到修改後的變量方法。調用:

incr(++squares); 

這增加81 1(由此得到82),然後將其發送到INCR方法。然後,該方法將更新它是由10送參數,得到92

然而,這個值是不返回,因此,打印語句產生82

如果你把打印語句內增量()方法,你會得到92

0
void go() { 
    squares++; 
    incr(squares); 
    System.out.println(squares); 
} 

增量平方得到82然後通過在一個刷新整數,它應該出來92

+2

至少做一些談話。這看起來像一個無聲的帖子。 –

0

由於squeres是一個局部變量來incr方法所以應該被

void go() { 
    squares = incr(++squares); 
    System.out.println(squares); 
} 
int incr(int squares) { 
    return (squares += 10); 
} 

void go() { 
    incr(++squares); 
    System.out.println(squares); 
} 
void incr(int squares) { 
    this.squares = squares + 10; 
} 
0

你是不是從incr方法返回您的增加值。如果你在屏幕上打印結果,你會發現它確實是92;

0

局部變量廣場是隱藏類變量

void incr(int squares) { 
    squares += 10; 
} 

您應該使用

void incr(int squares) { 
    this.squares += 10; 
} 
相關問題