2012-04-15 82 views
1

我真的不明白在Java中使用'this'。如果有人能幫我澄清,我會非常感激。有人可以向我詳細解釋'this'的用法嗎?

在這個網站上,它說:http://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

「在實例方法或構造,這是對當前對象的引用 - 它的方法或構造函數被調用的對象可以參考的任何成員。來自實例方法或構造函數中的當前對象。「

,並給出了下面的例子:

例如,Point類是這樣寫的

public class Point { 
    public int x = 0; 
    public int y = 0; 

    //constructor 
    public Point(int a, int b) { 
     x = a; 
     y = b; 
    } 
} 

,但它可能是這樣寫的:

public class Point { 
    public int x = 0; 
    public int y = 0; 

    //constructor 
    public Point(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 
} 

然而,我仍然不完全明白爲什麼x = a可以寫成this.x = x?爲什麼不是這個.x = a?爲什麼x在左邊?

對不起,但我對Java很新。我爲無聊的專家道歉。

+0

在第二個例子中,構造函數的參數名爲'x','y'不是'a'和'b',所以說'this.x = a'沒有意義,因爲沒有' a'存在。在你的第一個例子中'this.x = a'和'this.y = b'完全可以接受。 'this'用作區分同名變量的常用方法,如第二個示例中所示,如果您只是說'x = x',編譯器將無法分辨哪個'x'是哪個。 – 2012-04-15 22:58:04

回答

3

如果定義了一些與對象屬性同名的變量/參數,它將「重疊」該屬性的名稱,並且應該使用this.var_name。

所以是的,它可以寫成this.x = a,但有點多餘。

+0

你能指定爲什麼使用'this'引用是多餘的嗎?提前致謝。 – BugShotGG 2012-04-19 10:10:52

+0

忽略我以前的評論。 :) – BugShotGG 2012-04-19 10:22:34

2

在第二個示例中,其中一個參數被命名爲x。通過引用this.x,您的意思是方法所屬類的x字段/屬性。它可以理解爲: Point.x =參數x

這是用來區分兩者,使得代碼的含義清晰。

1

這不是this.x = a,因爲在第二個例子中沒有'a'。重點是你可以重複使用相同的變量名稱,這是不太令人困惑的: - |

+0

謝謝,這就是我沒有看到。 :D – Outlier 2012-04-15 23:04:10

1

「this」是對當前使用的對象的引用。當你在域和參數之間有名字衝突時使用它。參數優先於字段。

沒有衝突,沒有必要爲此:

public Point(int a, int b) { 
    x = a; 
    y = b; 
} 

但是這會工作,太:

public Point(int a, int b) { 
    this.x = a; 
    this.y = b; 
} 

名稱衝突,需要使用 「這個」:

public Point(int x, int y) { 
    this.x = x; 
    this.y = y; 
} 

如果你只有

public Point(int x, int y) { 
    x = x; 
    y = y; 
} 

那麼你只需要給自己的值分配參數,這樣做什麼都不做。

關鍵詞「this」有更多用法。

+0

非常感謝你清除了一切 – Outlier 2012-04-15 23:03:50

1

這個想法是讓它清楚你正在爲你的構造函數提供xy的值。

問題現在是由於在構造函數x引用傳遞的值而不是字段x的範圍規則。因此x = x會導致參數被賦予其自己的值,並且陰影字段不會被觸發。這通常不是想要的。

因此,需要一個機制來說「我需要另一個 x比在這裏立即可見的那個」。這裏this引用當前對象 - 因此this.x引用當前對象中的字段,並且super引用此對象的擴展對象,因此您可以進入「更高」字段。

0

「這個」是一個隱藏的「參數」,它被傳遞給你,以便對這個對象進行操作的方法知道他們正在操作哪個對象。

現在想象你傳遞了名稱「x」的參數,但該類確實已經定義了該var名稱。怎麼了 ?那麼,「屬於」對象和參數x的名稱x不是同一個數據對象,但它們共享該名稱。

爲了消除歧義,您需要明確說「this.x」,它告訴編譯器您正在討論已屬於「this」對象的x。 (也就是說,你想操作上當前對象。)

1

this是對當前對象的引用,讓你訪問它像任何其他對象 - this.xthisx財產。所以x是傳入的參數,您分配給this.x

這是命名空間 - 一個變量的名稱只適用於給定的代碼塊的想法。在java中,如果你在一個屬於這個類的函數中工作,你在這個類的名字空間內,但是,如果你有另一個與變量名相同的變量,它將優先,而你訪問屬性通過this

this也可以用其他方式使用。例如,假設我想提請當前對象的屏幕在一個虛構的圖書館,從類中,我可以這樣做:

window.draw(this) 

您也可以撥打功能

this讓我們引用對象,我們目前是'內部',所以我們可以傳遞當前對象作爲參數。這非常有用。 (沒有雙關語意)。

0

在第二個示例中,構造函數的參數不是ab;它們被更改爲xy,並且this.x = x;表示「將此Point類實例的成員變量x傳遞給構造函數的值設爲x」。

0

這確實與java編譯器如何通過名稱識別變量有關。函數(formaal)參數名稱在類成員變量之前。在第一個例子中,形式參數名稱是A和B,他們不與成員變量x和y碰撞所以寫

x = a; 

是邏輯爲x只能意味着成員變量類Point。

在第二個示例中,x既指形式參數名稱又指成員變量。在函數體內寫入x指的是參數,所以如果你需要其他方法來引用成員變量x。這是通過「this」關鍵字顯式訪問成員來完成的。

相關問題