2011-10-02 49 views
1

儘管我試圖理解爲什麼需要「this」,但我對它的目的非常困惑。例如,我編寫了以下內容:對Java中的「this」操作符感到困惑

public static void main (String args[]) 
{ 
    SandboxClass1 temp = new SandboxClass1(1,2,3); 
    System.out.println(temp.getX()); 
    System.out.println(temp.getY()); 
    System.out.println(temp.getZ()); 

    System.out.println("----------------------------"); 

    SandboxClass1 temp2 = new SandboxClass1(4,5,6); 
    System.out.println(temp2.getX()); 
    System.out.println(temp2.getY()); 
    System.out.println(temp2.getZ()); 
} 

public class SandboxClass1 
{ 

private int x = 1; 
private int y = 1; 
private int z = 0; 

public SandboxClass1(int x, int y, int zz) 
{ 
    this.x = x; 
    this.y = y; 
    z = zz; 
} 

public int getX() 
{ 
    return(this.x); 
} 

public int getY() 
{ 
    return(this.y); 
} 

public int getZ() 
{ 
    return(this.z); 
} 

} 

爲什麼我需要編寫「this.z = ZZ」
的時候我也可以同樣寫道,「Z = ZZ」?

+2

爲'z'和'zz'你不應該需要'this'。 –

+1

在不強制的地方使用它,就像在你的getter中一樣,只是編碼風格的問題。 –

回答

2

在你SandboxClass1構造函數中,你有兩個變量對每個稱爲x和y。有對象本身聲明的x和y(「private int x = 1」),以及作爲構造函數參數的單獨x和y(「int x」)。

本地(參數)變量陰影類變量。因此,如果在構造函數中您只是做了

x = x; 

該賦值將不起作用。

關鍵字this是對調用方法/構造函數的對象的引用。在聲明中

this.x = x; 

您正在使用它將其分配給其他x級的課程。通過限定名字,你可以區分它們。

沒有必要使用帶有z/zz賦值的this,因爲它們具有不同的名稱。

getX/Y/Z方法中也沒有必要,因爲在這些方法中沒有局部變量來隱藏相關的類變量。它雖然沒有傷害

+1

示例中的任何內容都不在「類」級別;也就是說,沒有一個示例變量是類變量。在這個例子中的是實例變量,而不是類變量。 – jbindel

2

它具有相同的效果。如果存在覆蓋類的字段的局部變量,則需要this;那麼你得到的是局部變量而不是類字段。

您可以更好地指示變量的其他優點。如果有this;這是一個領域;本地變量,否則。

1

「這個」運營商只是提煉這個屬性/字段屬於你的工人階級這是非常有用磨片你有,例如,兩個變量具有相同的名稱:

this.zz = zz; 
3

你不, 在這種情況下。只有在需要消除歧義時才需要,就像參數和實例變量共享一個名稱時一樣。

有些人更喜歡使用「this」來消除概念上的歧義,並明確聲明代碼引用了一個實例變量。

(在一個側面說明,圍繞返回值的括號是不必要的,有點吵,IMO)

2

SandboxClass1構造函數中,兩個參數(xy)隱藏類變量,因爲它們具有相同的名稱。如果要在代碼> SandboxClass1構造函數中將類變量x指定爲任何值,則必須使用this.x來解決該問題,以告知編譯器「我想分配名爲x的類範圍變量,而不是名爲的方法範圍變量X」。這同樣適用於y。

由於參數z沒有隱藏名爲zz的類作用域變量,所以不需要告知編譯器zz變量的作用域,類作用域zz是唯一被識別的變量,因此這是被賦值的變量。

1

與Objective-C不同的是,當方法或變量是本地的時候,「this」是可選的,並且沒有其他相同名稱的衝突用法。

它在派生衝突名稱的情況下很方便,例如在設置實例變量的方法中,例如void setOnionCount(int onionCount)您希望將「onionCount」用於形式參數但仍具有「onionCount」作爲實例變量名稱。在這種情況下,你可以做this.onionCount = onionCount;,每個人都很開心(除非我想,花生畫廊的人會反對這種技術)。

當您需要將對當前對象的引用傳遞給其他類時,「this」也是絕對必要的。

2

該關鍵字用於引用類中的屬性。這個關鍵字是爲了區分類屬性和方法參數而創建的。像這樣:

public class human 
{ 
    public void setName(String name) 
    { 
     // the first name is a reference to the class attribute name 
     this.name = name; 
     // the second name is a reference to the method parameter name 
    } 

    // definition of the class attribute name 
    private String name; 
} 

當您使用關鍵字這一點,指的是類中的name變量下面有一個例子,你不需要使用:

public class Human 
{ 
    public void setName(String myName) 
    { 
     name = myName 
    } 

    private String name; 
} 

看到現在只有1個名爲name的變量,並且只有一個名爲myName的變量。在另一個例子中,有兩個名爲name的變量。一個是類屬性,另一個是方法參數。

1

嘿,這是用來提供調用對象的參考。也就是說,假設你的課堂是盒子,那麼如果你想提供它的對象,那麼你可以使用this關鍵字在課堂框中提供它。

class Box { 
    int x; 
    public Box(int x){ 
     this.x = x; 
    } 
} 

這裏在這種情況下,如果你的目標是OB(即Box ob = new Box(1))則引用將被傳遞給自身。 注意:您不能在課堂外使用此關鍵字。如果你這樣使用,那麼它會給另一個類提供參考。 ,關於這個關鍵字的完整細節請參考以下鏈接 http://download.oracle.com/javase/tutorial/java/javaOO/thiskey.html