簡體   English   中英

Java中使用此關鍵字的問題

[英]issues with use of this keyword in java

我是Java的新手,試圖理解java中此關鍵字的用法。根據文檔,如果實例和本地變量具有相同的名稱,則本地變量將屏蔽實例變量。我們使用此關鍵字,以便實例變量可能不會被本地屏蔽下面是我正在編寫的程序,用於了解此關鍵功能的用法,但是即使在使用此關鍵字實例變量之后,該變量仍然被屏蔽。

class Box{
int height=5;
int length=10;
int breadth=15;


int CalcVol(){
int vol = height*breadth*length;
return vol;
}

Box(int height, int length,int breadth){
this.height = height;
length = length;
breadth = breadth;

System.out.println("height  is "  + height);

}

}

class MyBox{

public static void main(String args[]){
Box mybox1 = new Box(10, 20, 30);
int vol=mybox1.CalcVol();
System.out.println("volume is"  + vol);

}
}

我在想的是,在Box構造函數中打印的變量“高度”應該打印5,即實例變量的值,但打印10,即作為參數傳遞的值。請對此提供幫助。

您需要在要訪問的每個字段之前添加this

Box(int height, int length,int breadth){
// ...and move this statement to the beginning, otherwise this.height gets overriden.
System.out.println("height  is "  + this.height);

this.height = height;
this.length = length;
this.breadth = breadth;


}

否則, length = lengthbreadth = breadth無效。

這是一個名稱沖突問題。

構造函數Box中包含參數heightlengthbreadth 這些也是Box中三個字段的名稱。

在Java中,人們認為成員變量和塊變量比字段變量“更近”。 這樣,如果您對兩者使用完全相同的名稱(如您所完成的),則分配

 height = height

會將參數height分配為其完全相同的值(實際上是noop)。

為了避免這個問題,你會指定 height要分配。

 this.height = height;

這是“此類的高度”或“場高”的簡寫。 當沒有名稱沖突時,編譯器將假定您的意思是字段變量。 因為在該區塊中沒有其他名稱。

順便說一句,這是學習如何使用final關鍵字的一個很好的理由。 Final表示變量只能分配一次,並且只能分配一次。 這樣可以防止在您可能永遠不會想要的情況下重新分配它。

例如

public Box(final int height, final int width, final int breadth) {

然后會拋出一個錯誤

  height = height;

因為您要重新分配高度值。 此類技術在編寫代碼時非常有價值,因為當您真正編寫參數分配時,它們會阻止您編寫您認為是字段分配的內容。

您將在此處執行分配,這將使this.height接受參數height的值。

this.height = height;

如果要打印this.height的原始值,請將打印結果放在賦值上方,並使用this.height打印。

System.out.println("height  was "  + this.height);

更完整地說,您的構造函數應如下所示。 請注意,每次訪問由局部變量隱藏的任何實例變量時,都需要在this關鍵字前面添加前綴。

Box(int height, int length,int breadth){
    System.out.println("height  was "  + this.height);
    this.height = height;
    this.length = length;
    this.breadth = breadth;
}

對於您的班級:

class Box{
    int height=5;
    int length=10;
    int breadth=15;

    Box(int height, int length,int breadth){
        this.height = height;
        length = length;
        breadth = breadth;

        System.out.println("height  is "  + height);

    }

 }

當您構造Box時,會發生以下情況:

  1. 實例變量的height被設置為構造函數的參數height
  2. 正在將構造方法參數length設置為其自身(不更改實例變量length
  3. 構造函數參數的breadth被設置為自身(不改變實例變量的breadth )。

您可能要在構造函數中執行的操作是使用傳遞到構造函數的值來設置實例變量,如下所示:

Box(int height, int length,int breadth){
    this.height = height;
    this.length = length;
    this.breadth = breadth;
}

我認為OP並沒有理解一般的面向對象程序設計,而是不了解Java中this鍵盤的用法,而是了解他如何在值已更改時打印“ 5”。 一旦您理解了這個概念, this關鍵字就會變得不那么混亂。

假設您有Box類,並且它只有一個值height:

class Box {
    // This is a instance variable, that is, each new instance of Box 
    // has a different height variable even if they are all equal to 5
    // initially. It's a different variable in memory.
    int height = 5; 

    // Here's our constructor that sets this instance's value of height
    Box(int height){
        this.height = height;
    }

當創建一個新Box時,您正在創建一個新Box對象 -每個對象的高度最初將從5開始,但是您正在更改構造函數中Box實例的高度。

Box box1 = new Box(10); // Height was originally 5, but changed to 10 in the constructor
Box box2 = new Box(20); // Height was originally 5, but changed to 20 in the constructor
Box box3 = new Box(30); // Height was originally 5, but changed to 30 in the constructor

當您在原始程序中到達以下代碼行時:

System.out.println("height  is "  + height);

不管是this.height還是height ,它永遠不會返回5。 您已經在構造函數中更改了實例的height值

那就這樣 我們如何打印默認高度5? 你不能 不能使用相同的變量名。 您必須在類中定義常量(例如final int HEIGHT = 5 ),以代表該類的默認值,或者使用另一個未設置這些值的構造函數。

class Box{

    int height=5;
    int length=10;
    int breadth=15;

    int CalcVol(){
        int vol = height*breadth*length;
        return vol;
    }

    Box() {
        System.out.println("height  is "  + height);
    }

    Box(int height, int length,int breadth) {
        this.height = height;
        this.length = length;
        this.breadth = breadth;
        System.out.println("height  is "  + height);
    }
}

class MyBox{

    public static void main(String args[]){

        Box mybox1 = new Box(10, 20, 30); // this will never print 5, and always 10
        Box mybox2 = new Box(); // this will always print 5

    }
}

但是,如果將print語句移到賦值上方並像Maxim Maxim Bernard一樣使用this.height ,它將打印出5,因為我們尚未更改該值。

    Box(int height, int length,int breadth) {
        System.out.println("height  is "  + this.height); // this will print out 5
        this.height = height;
        this.length = length;
        this.breadth = breadth;
    }

如果這確實令人困惑,則建議不要閱讀Java的this關鍵字,而建議閱讀一些有關OOP的文章。 然后您將了解, this僅表示類的當前實例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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