[英]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 = length
和breadth = breadth
無效。
這是一個名稱沖突問題。
構造函數Box
中包含參數height
, length
和breadth
。 這些也是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時,會發生以下情況:
height
被設置為構造函數的參數height
length
設置為其自身(不更改實例變量length
) 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.