2009-02-23 148 views
18

我試圖理解java關鍵字this究竟是做什麼的。 我一直在閱讀Sun的文檔,但我仍然對this實際上的功能很模糊。在java中使用關鍵字「this」

+1

@JasonC問題只能是本網站其他問題的重複。 – 2014-08-18 15:55:41

回答

36

this關鍵字是對當前對象的引用。

class Foo 
{ 
    private int bar; 

    public Foo(int bar) 
    { 
     // the "this" keyword allows you to specify that 
     // you mean "this type" and reference the members 
     // of this type - in this instance it is allowing 
     // you to disambiguate between the private member 
     // "bar" and the parameter "bar" passed into the 
     // constructor 
     this.bar = bar; 
    } 
} 

另一種方式去思考那就是this關鍵字就像您使用引用自己人稱代詞。其他語言對於相同的概念有不同的詞。 VB使用Me和Python約定(因爲Python不使用關鍵字,只是每個方法的隱式參數)將使用self

如果你要引用本質上是你的目標,你會說,像這樣的:this只是一個方式爲

手臂或

思考一種說「我的」的類型。因此,一個僞碼錶示應該是這樣的:

class Foo 
{ 
    private int bar; 

    public Foo(int bar) 
    { 
     my.bar = bar; 
    } 
} 
+1

您可以在不使用「this」的情況下進行上述操作,例如使用匈牙利符號等。 m_bar = bar。所以並沒有真正解釋這是什麼真的很重要。 – 2009-02-23 13:18:47

+1

是否可以避免這樣的奇怪構造? – Magnar 2009-02-23 13:25:46

+0

@ng:當你不能重命名該字段時,你會做什麼?就像它是來自超級班的受保護的領域一樣? – 2009-02-23 13:37:06

6

「this」是對當前對象的引用。

見詳情here

4

一個更好的利用這一

public class Blah implements Foo { 

    public Foo getFoo() { 
     return this; 
    } 
} 

它可以讓你明確「本」對象在當前上下文中。另一個例子:

public class Blah { 

    public void process(Foo foo) { 
     foo.setBar(this); 
    } 
} 

你還能怎麼做這些操作。

5

The keyword this is a reference to the current object。這是最好用下面的代碼解釋:

public class MyClass { 

    public void testingThis() 
    { 
     // You can access the stuff below by 
     // using this (although this is not mandatory) 

     System.out.println(this.myInt); 
     System.out.println(this.myStringMethod()); 

     // Will print out: 
     // 100 
     // Hello World 
    } 

    int myInt = 100; 
    string myStringMethod() 
    { 
     return "Hello World"; 
    } 

} 

它不是用了很多,除非你有碼標在你的地方告訴你使用this關鍵字。有它一個共同使用,如果你遵循代碼約定,你必須是相同的參數名稱爲您的類屬性這就是:

public class ProperExample { 
    private int numberOfExamples; 

    public ProperExample(int numberOfExamples) 
    { 
     this.numberOfExamples = numberOfExamples; 
    } 
} 

一個正確使用this關鍵字的是鏈構造(使在整個構造函數中構造對象一致):

public class Square { 
    public Square() 
    { 
     this(0, 0); 
    } 

    public Square(int x_and_y) 
    { 
     this(x_and_y, x_and_y); 
    } 

    public Square(int x, int y) 
    { 
     // finally do something with x and y 
    } 
} 

此關鍵字在例如C#。

1

關鍵字'這個'是指當前對象的上下文。在很多情況下(如Andrew指出),您將使用明確的這個來說明您指的是當前對象。

此外,從 'this and super':

*有其他用途這一點。有時,在編寫實例方法時,需要將包含該方法的對象作爲實際參數傳遞給子例程。在這種情況下,您可以將其用作實際參數。例如,如果你想打印出對象的字符串表示,你可以說「System.out.println(this);」。或者你可以在賦值語句中將這個值賦給另一個變量。

事實上,你可以做這樣的事情,你可以做任何其他變量,除了改變其值。*

該網站也指「超級」的相關概念,這可能證明有助於理解這些如何與繼承工作。

0

從英文角度來看,「這個對象」是你當前擁有的對象。

WindowMaker foo = new WindowMaker(this); 

例如,您目前從JFrame的擴展一個類裏面,你想傳遞給WindowMaker的對象的引用對JFrame,因此它可以與JFrame的交互。您可以通過將引用傳遞給名爲「this」的對象來傳遞對JFrame的引用。

21

關鍵字this在不同的情況下可能意味着不同的事情,這可能是您的困惑的來源。

它可以用來作爲它是指該實例的當前方法被稱爲上的對象引用:return this;

它可以用來作爲其是指當前構造器創建實例,例如一個對象引用訪問隱藏的字段:

MyClass(String name) 
{ 
    this.name = name; 
} 

它可被用於從一個構造中調用AA類的不同構造:

MyClass() 
{ 
    this("default name"); 
} 

它可以被用來訪問來自一個嵌套類內包圍實例:

public class MyClass 
{ 
    String name; 

    public class MyClass 
    { 
     String name; 

     public String getOuterName() 
     { 
      return MyClass.this.name; 
     } 
    } 
} 
1

它是一個類的實際實例在同一類的方法中的引用。 編碼

public class A{ 
    int attr=10; 

    public int calc(){ 
    return this.getA()+10; 
    } 
    /** 
    *get and set 
    **/  

}//end class A 

計算值()體,軟件運行當前分配對象內部的方法。

對象的行爲可能會如何看待自身?正好與這個關鍵字。

說真的,這關鍵字不要求強制使用(如超級),因爲JVM知道在哪裏調用儲存區的方法,但在我看來這使代碼更readeable。

1

它也可以用來訪問當前上下文中的信息。 例如:

public class OuterClass 
{ 
    public static void main(String[] args) 
    { 
    OuterClass oc = new OuterClass(); 
    } 

    OuterClass() 
    { 
    InnerClass ic = new InnerClass(this); 
    } 

    class InnerClass 
    { 
    InnerClass(OuterClass oc) 
    { 
     System.out.println("Enclosing class: " + oc + "/" + oc.getClass()); 
     System.out.println("This class: " + this + "/" + this.getClass()); 
     System.out.println("Parent of this class: " + this.getClass().getEnclosingClass()); 
     System.out.println("Other way to parent: " + OuterClass.this); 
    } 
    } 
} 
2

「this」關鍵字是指當前對象由於該方法是下執行。它也用於避免每當實例變量和局部變量具有相同名稱時,作爲方法中的參數傳遞的本地變量與實例變量之間的歧義。

例::

public class ThisDemo1 
{ 
    public static void main(String[] args) 
    { 
     A a1=new A(4,5);  
    } 
} 

class A 
{ 
    int num1; 
    int num2; 

    A(int num1) 
    { 
     this.num1=num1; //here "this" refers to instance variable num1. 
     //"this" avoids ambigutiy between local variable "num1" & instance variable "num1" 

     System.out.println("num1 :: "+(this.num1)); 
    } 

    A(int num, int num2) 
    { 
     this(num); //here "this" calls 1 argument constructor within the same class. 
     this.num2=num2; 
     System.out.println("num2 :: "+(this.num2)); 
     //Above line prints value of the instance variable num2. 
    } 
} 
0

每個對象可以訪問到自身的引用與此關鍵字(有時稱爲本 參考)。

首先讓承擔代碼

public class Employee { 

private int empId; 
private String name; 

public int getEmpId() { 
    return this.empId; 
} 

public String getName() { 
    return this.name; 
} 

public void setEmpId(int empId) { 
    this.empId = empId; 
} 

public void setName(String name) { 
    this.name = name; 
} 

}

在上述方法中的getName看看()返回的實例變量名。 現在讓我們類似的代碼再看看是

public class Employee { 

private int empId; 
private String name; 

public int getEmpId() { 
    return this.empId; 
} 

public String getName() { 

    String name="Yasir Shabbir"; 
    return name; 
} 

public void setEmpId(int empId) { 
    this.empId = empId; 
} 

public void setName(String name) { 
    this.name = name; 
} 


public static void main(String []args){ 
    Employee e=new Employee(); 
    e.setName("Programmer of UOS"); 

    System.out.println(e.getName()); 

} 

}

輸出 亞西爾Shabbir

  • 該運營商總是以實例變量工作(屬於對象) 沒有任何類變量(屬於類)
  • 這總是指類非靜態屬性不是任何其他參數或局部變量。
  • 這總是在非靜態方法使用
  • 該運營商不能在靜態變量工作(類變量)

**注:**這往往是當一個方法包含一個參數或局部變量中的邏輯錯誤該名稱與該類的字段具有相同的名稱 。在這種情況下,如果您想訪問類的 字段,請使用引用this - 否則將引用方法參數或局部變量。

0

什麼'這'很簡單。它持有當前 對象的參考。

  • 此關鍵字持有
  • 此關鍵字不能靜態功能或靜止象素塊內使用當前類的實例的參考
  • 此關鍵字可以用於訪問實例的陰影可變
  • 此關鍵字可用於在函數調用中傳遞當前對象作爲參數
  • 此關鍵字可用於創建構造函數鏈

來源:http://javaandme.com/core-java/this-word