簡體   English   中英

Java類中全局變量的范圍及其在同一類方法中的行為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM