[英]Scope of global variables in a java class and their behavior in methods of the same class
我是編程和Java的新手,我對同一類方法中全局變量的行為有些困惑。 在我所學習的課程提供的一個練習題中,詢問我執行inc(b)
后變量b的值是多少。
int b;
int inc(int b){
b++;
return b;
}
b = 5;
inc(b);
答案是5,而不是6,據我所知,這是因為Java是按值傳遞的,而方法inc
中的所有參數此后都會被遺忘。
另一方面,在Java類中,建議為所有實例變量編寫set和get方法。 然后我的問題是,為什么setter可以更改實例變量並在setter之外保持其值? 換句話說,為什么在上面的示例中變量更改“忘記”,而在set方法中“記住”了呢?
public void setName ( String n ) {
name = n;
}
換句話說,為什么在上面的示例中變量更改“忘記”,而在set方法中“記住”了呢?
在inc
方法中,您根本不需要更改名為b
的字段 。 您有一個名為b
的參數 ,因此每次代碼在方法中引用b
,它都引用參數而不是字段。 這稱為陰影 。 如果將其更改為:
int b;
int inc(int b) {
this.b++;
return this.b;
}
...然后該參數將被忽略,它將改為增加字段。
基本上,您需要考慮inc
方法要執行的操作:
方法變量是局部變量。 它們的范圍僅限於方法執行。 如果要更改類變量,則必須通過執行以下任一操作將其分配給類變量,就像在setter情況下一樣。
void inc(int b){
b++;
this.b=b ;
}
要么
int inc(int b){
b++;
return b ;
}
然后
b = inc(b);
聽起來您好像不了解OOP(面向對象的編程)。
Set方法是類的成員,該類跟蹤內部更改。
通過使用setter,您可以更改類實例的內容。 它不是“被遺忘的”,因為首先創建了類的實例(而沒有創建函數)。
有關類實例的更多信息,請參見對象創建 。
您只是偶然發現了內置函數( boolean, char, byte, short, int, long, float, double
)和Objects的區別。 正如您已經說過的: Java是按值傳遞 。 總是。 但是,內置項和對象之間存在細微的差異。 當您將對象作為參數傳遞時(就像在setter中一樣),您實際上傳遞的是引用的值(即存儲位置),而不是實際的對象本身。 此外,在兩個示例中,用例也不同:一種方法( inc
)修改參數,而另一種方法( setName
)修改對象的屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.