2010-09-16 128 views
96

通常情況下,我只在構造函數使用this什麼是「本」在Java中的含義是什麼?

我明白,這是用來標識參數變量(通過使用this.something),如果它有一個全局變量相同的名稱。

但是,我不知道this在Java中的真正意義,以及如果我使用this沒有點(.)會發生什麼。

+6

給回覆者:http://meta.stackexchange.com/questions/15775/do-you-delete-your-own-answer-when-its-a-duplicate – BalusC 2010-09-16 15:19:35

+1

Yakshemash! SO朋友。你可能想在這裏引用我的問題 - https://stackoverflow.com/questions/23334336/this-in-java-exception-in-thread-main-java-lang-stackoverflowerror Chenqui。 – 2014-04-28 17:16:34

回答

12

它是指特定對象的當前實例,所以你可以編寫類似

public Object getMe() { 
    return this; 
} 
+4

調用它時要小心使用正確的樣式:o.getMe()。getMe().outOfHere() – 2010-09-16 15:31:09

3

這是「一個在當前上下文對象引用」有效。例如,要打印出「這個對象」你可能會這樣寫:

System.out.println(this); 

請注意,您的「全局變量」的使用是有點過......如果你使用this.variableName然後通過定義它一全局變量 - 它是特定於此特定實例的變量。

2

這可以某些方法或構造內使用。

它返回參照當前對象。

4

它指的是在其上調用方法

class A { 

    public boolean is(Object o) { 
    return o == this; 
    } 

} 

A someA = new A(); 
A anotherA = new A(); 
someA.is(someA); // returns true 
someA.is(anotherA); // returns false 
133

this指當前對象的實例。

每個非靜態方法運行在一個對象的上下文。所以,如果你有一個這樣的類:

public class MyThisTest { 
    private int a; 

    public MyThisTest() { 
    this(42); // calls the other constructor 
    } 

    public MyThisTest(int a) { 
    this.a = a; // assigns the value of the parameter a to the field of the same name 
    } 

    public void frobnicate() { 
    int a = 1; 

    System.out.println(a); // refers to the local variable a 
    System.out.println(this.a); // refers to the field a 
    System.out.println(this); // refers to this entire object 
    } 

    public String toString() { 
    return "MyThisTest a=" + a; // refers to the field a 
    } 
} 

然後調用frobnicate()new MyThisTest()將因此有效地打印

 
1 
42 
MyThisTest a=42 

您使用它的許多內容:

  • 澄清,和你談話有關字段,當有其他人也具有相同名稱的東西作爲一個字段
  • 指當前OBJ ECT整體
  • 調用當前類的其他構造在構造函數
+0

這不起作用。我得到一個錯誤,說需要一個'main'方法。如果我添加主要方法,那麼我必須從那裏調用。任何試圖在main中調用frobnicate()的方法都表示你不能從靜態引用中調用非靜態引用。並且從'main'中移除靜態函數會再次返回錯誤,表示沒有找到主要方法。請解釋。 – dbconfession 2014-09-11 21:34:26

+4

@dbconfession:這裏的代碼不是作爲一個獨立的自運行程序。你的意思是*閱讀*代碼* **和**文本,而不是運行它!它是有效的代碼,但它僅用於演示目的(這就是爲什麼它沒有合適的主體)。有關主要方法的幫助,請參閱http://stackoverflow.com/questions/146576/why-is-the-java-main-method-static。 – 2014-09-12 12:40:55

+0

@Joachim謝謝!我錯過了一些基本的東西,它意味着讓一個方法變成靜態的,以及'this.'如何工作。我的理解是,'this.'允許你調用一個方法或變量,這個方法或變量對於類的實例化版本是唯一的,允許另一個方法或變量版本存在,而不會調用'this.'。在一個簡單的調用'Test.class'我有兩個方法:'公共靜態無效的主要()'和'公共測試()'我不能在方法之間傳遞信息,因爲'main'是靜態的,並且構造函數不能靜態。我應該發佈一個新問題嗎? – dbconfession 2014-09-12 20:32:23

7

在揮杆的相當普遍編寫實現ActionListener一類,並添加當前實例(即「本」),作爲一個ActionListener組件。

public class MyDialog extends JDialog implements ActionListener 
{ 
    public MyDialog() 
    { 
     JButton myButton = new JButton("Hello"); 
     myButton.addActionListener(this); 
    } 

    public void actionPerformed(ActionEvent evt) 
    { 
     System.out.println("Hurdy Gurdy!"); 
    } 

} 
47

以下是here副本&粘貼,但解釋this關鍵字的非常好所有不同的用途:

定義:Java的this關鍵字用於在參考該方法的當前實例它被使用。

以下是使用這種方式:

  1. 要明確表示實例變量是用來代替靜態或局部變量。也就是,

    private String javaFAQ; 
    void methodName(String javaFAQ) { 
        this.javaFAQ = javaFAQ; 
    } 
    

    這裏指的是實例變量。這裏局部變量的優先級很高。因此,缺少this表示局部變量。如果作爲參數名稱的局部變量與實例變量不相同,則不管是否使用this,它都表示實例變量。

  2. This用於指構造函數

    public JavaQuestions(String javapapers) { 
        this(javapapers, true); 
    } 
    

    這調用它有兩個參數相同的Java類的構造函數。

  3. This用於當前的Java實例傳遞的參數

    obj.itIsMe(this); 
    
  4. 類似上述這也可以用來返回當前實例

    CurrentClassName startMethod() { 
        return this; 
    } 
    

    注:這可能會導致在以上兩點中用於內部課堂時會導致不良結果。因爲這將引用內部類而不是外部實例。

  5. This可以用來獲得當前類

    Class className = this.getClass(); // this methodology is preferable in java 
    

    的手柄雖然這可以通過

    Class className = ABC.class; // here ABC refers to the class name and you need to know that! 
    

一如往常進行,this與它的實例相關聯,這在靜態方法中不起作用。

+2

我希望我能夠upvote 10次,尤其是第一和第五點。我一直努力瞭解'這個'的意義,直到我找到這個爲止。精緻! – 2014-01-13 13:01:41

6

如果你打電話myObject.method()那麼this將指裏面method

35

是完整的,this也可用於指外對象

class Outer { 
    class Inner { 
     void foo() { 
      Outer o = Outer.this; 
    } 
    } 
} 
+0

這是我正在尋找的! ;) – forresthopkinsa 2017-06-27 18:32:29

3

對象有方法和屬性被從類派生的(變量),以指定哪些方法和變量屬於使用了一個特定的對象this保留字。在實例變量的情況下,理解隱式參數和顯式參數之間的差異非常重要。看看fillTank呼叫audi對象。

Car audi= new Car(); 

audi.fillTank(5); // 5 is the explicit parameter and the car object is the implicit parameter 

在括號中的值是隱式的參數和對象本身是明確的參數,不具有明確的參數,使用隱式參數的方法,該方法fillTank同時具有顯式和隱式參數。

讓我們在fillTank方法在Car

public class Car() 
{ 
    private double tank; 

    public Car() 
    { 
     tank = 0; 
    } 

    public void fillTank(double gallons) 
    { 
     tank = tank + gallons; 
    } 

} 

仔細一看這節課,我們有一個實例變量「坦克」。可能有很多對象使用了tank實例變量,爲了指定實例變量「tank」用於特定對象,在我們的例子中,我們使用了前面構建的「audi」對象,我們使用this保留關鍵字。對於實例變量方法中使用「this」指示實例變量(在本例中爲「tank」)是隱式參數的實例變量。

java編譯器會自動添加this保留字,所以您不必添加它,這是一個偏好問題。你不能使用沒有點(。)的this,因爲這些是java的規則(語法)。

綜上所述。

  • 對象由類定義並具有方法和變量
  • 方法實例變量採用this表明,實例變量屬於隱式參數,或者說,它是隱式參數的實例變量。
  • 隱式參數是在這種情況下調用方法的對象「audi」。
  • Java編譯器自動將這個保留字,將其添加是偏好的問題
  • this不能沒有點(。)這是句法無效
  • this還可以使用的局部變量來區分使用和具有相同名稱的全局變量
  • this保留字也適用於方法,用於指示方法屬於特定對象。
2

關鍵字被用於指一個塊的當前可變的,例如考慮下面的代碼(只是一exampple,所以不要指望標準Java代碼):

Public class test{ 

test(int a) { 
this.a=a; 
} 

Void print(){ 
System.out.println(a); 
} 

    Public static void main(String args[]){ 
    test s=new test(2); 
    s.print(); 
} 
} 

那它。輸出將是「2」。 如果我們沒有使用這個關鍵字,那麼輸出將是:0

0

我也在尋找相同的答案,並以某種方式無法理解清楚的概念。但最後我明白了這一點link

這是Java中的一個關鍵字。它可以用在類的方法或構造函數中。它(this)用作對其方法或構造函數被調用的當前對象的引用。這個關鍵字可以用來從實例方法或構造函數中引用當前對象的任何成員。

檢查在link的例子爲一個清醒的認識

1

如果作爲在構造函數中聲明的變量,然後我們用實例變量相同的「本」來分配數據。

class Example{ 
    int assign;// instance variable 

    Example(int assign){ // variable inside constructor 
      this.assign=assign; 
    } 
} 

希望這有助於。

0

在Java中,「this」是一個預定義的變量。如果我們在方法中使用「this」,這意味着我們正在獲取當前運行對象的引用(地址)。舉一個例子。

this.age --->當前運行對象的年齡。