JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 新手區 » Object/物件導向  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 給新手 - this 到底是什麼? [精華]
caterpillar

良葛格

版主

發文: 2613
積分: 70
於 2003-08-28 18:00 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
很多新手學習Java時,一定都會搞不清楚this到底是什麼?!當初我也是這樣的,這篇文章告訴新手什麼是this?為什麼要有this!

如果文章有所謬誤,請通知我以便修改!以免誤導大眾。。。。。。

======================================================================

考慮下面這個類別:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Ball {
    private double radius;
    private String name;
                                                                                
    public Ball() { radius = 0.0;  name = "null"; }
                                                                                
    public Ball(double r, String n) { radius = r; name = n; }
                                                                                
    public double getRadius() { return radius; }
                                                                                
    public double getVolumn() {
        return (4 / 3 * Math.PI * radius * radius * radius);
    }
                                                                                
    public String getName() { return name; }
                                                                                
    public void setRadius(double r) { radius = r; }
    public void setName(String n) { name = n; }
}


當我們使用這個類別新增兩個物件b1(1, "RBall")與b2(2, "GBall")時,b1與b2會各自擁有自己的radius與name資料成員,然而函式成員在記憶體中卻只有一份。

當我們使用b1.getName()方法取回name的名稱,它會傳回"RBall"名稱,而使用b2.getName()時,它會傳回"GBall"名稱,即然類別的函式成員只有一份,getName()如何知道它傳回的name是b1物件的,還是b2物件的呢?

其實我們使用物件名稱來呼叫函式成員時,程式會將物件記憶體位址告知函式成員,而在函式中,一個類別資料成員其實會隱含一個this參考,這個this參考會儲存傳遞進來的物件記憶體位置,當我們呼叫getRadius()函式時,其實我們相當於執行:
1
2
3
public double getRadius() {
    return this.radius;
}


當b1呼叫getRadius()方法時,this所參考的就是b1的記憶體位址,而使用b2呼叫getRadius()方法時,this所參考的就是b2的記憶體位址,所以getRadius()可以正確的得知該傳回哪一個物件的radius資料。

每一個類別的函式成員都會隱含一個this參考,用來指向呼叫它的物件,當我們在函式中使用資料成員時,都會隱含的使用this參考,當然我們也可以明確的指定,例如在函式定義時使用:
1
2
3
4
public Ball(double r, String n) {
    this.radius = r;
    this.name = n;
}


這麼作在這個例子中是多此一舉,只是更明確的在程式碼中撰寫而已,然而這種寫法在某些時機是需要的,例如參數名稱與資料成員名稱相同時,為了識別是參數或是資料成員,我們必須明確的使用this參考來指定,例如:
1
2
3
4
public Ball(double radius, String name) {
    this.radius = radius;
    this.name = name;
}


再介紹一個this參考的使用時機:當物件需要得知自己的記憶體位址時。這種例子很多,例如告知某個函式處理對象為自己、或在Java視窗程式中,註冊物件本身為事件處理者,例如下面這個簡單的Java程式中就有使用到this參考:
1
2
3
4
5
6
7
8
9
10
11
class GUIExample extends JFrame implements MouseListener {
    // ....
        addMouseListener(this);   // 實作事件處理的物件為自已
    // ....
 
    // ==  滑鼠事件實作 ==
    public void mouseEntered(MouseEvent e) {
        // .....
    }
    // ....
}


這只是一個示範,告知您this參考的用法,如果日後您學到Java視窗程式的事件處理,相信這樣的例子您會看到不少。


caterpillar edited on 2006-09-13 23:12
reply to postreply to post
良葛格學習筆記
作者 Re:給新手 - this 到底是什麼? [Re:caterpillar]
iszero



發文: 0
積分: 0
於 2003-08-29 00:29 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
謝謝
不知我這樣認知對不對?
1,this 是指目前物件所在類別
2,當類別之變數名稱和建構子參數相同時,以this.變收名稱=參數引數值
3,物件宣告成立時,已各自擁有自己的物件變數

不知是否正確?


reply to postreply to post
作者 Re:給新手 - this 到底是什麼? [Re:iszero]
caterpillar

良葛格

版主

發文: 2613
積分: 70
於 2003-08-29 23:25 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
iszero wrote:
謝謝
不知我這樣認知對不對?
1,this 是指目前物件所在類別


this不是指向類別,this指向物件的記憶體位置。

2,當類別之變數名稱和建構子參數相同時,以this.變收名稱=參數引數值


當類別變數名稱與函式參數相同時,函式參數的作用範圍會覆蓋類別變數,使用this明確指定的話,就是明確告知程式,現在我要使用物件自已的類別資料成員,而不是函式的參數。

3,物件宣告成立時,已各自擁有自己的物件變數


是的,但static變數除外,static變數是類別所擁有。


reply to postreply to post
良葛格學習筆記
作者 Re:給新手 - this 到底是什麼? [Re:caterpillar]
xin_no2

Love



發文: 54
積分: 0
於 2004-08-10 07:00 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Thank You caterpillar.
U are Pro java programmer ???


reply to postreply to post
作者 Re:給新手 - this 到底是什麼? [Re:caterpillar]
alien

小弟劣作一幅



發文: 772
積分: 6
於 2004-08-10 11:43 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
補充一點.

談到 this 的話, 新手該小心一件事.
this 這 syntax 有兩種不同的用法, 兩者看上去有點相像, 但實際上是不同的.

一種是 caterpillar 說到的, 在 instance methods 中用以取得該 object
instance 的 reference.

this 的另一種用途是在 constructor 中, 在 constructor 的開首可以用
this(......) 來 invoke 本 class 另一個 constructor. 比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
class Student {
  private Strng name;
  private int age;
 
  public Student(String name, int age) {
    this.name = name;
    this.age = age;
  }
  public Student() {
    this("Default Name", 0);    //!!! 這裡
  }
}
 


新手該小心不要混淆這兩種語法. 雖然都是 this, 但兩者的功能及意義是不同的

類似的情況也見於 super 這 keyword 上 (留待各位看倌自己看一看書了)


reply to postreply to post

public class Alien {
public boolean isNewbie() {
return true;
}
public String toString() {
return "請大家多多指教";
}
}
作者 Re:給新手 - this 到底是什麼? [Re:caterpillar]
pcbill





發文: 75
積分: 1
於 2004-08-10 13:01 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
caterpillar wrote:
當類別變數名稱與函式參數相同時,函式參數的作用範圍會覆蓋類別變數,使用this明確指定的話,就是明確告知程式,現在我要使用物件自已的類別資料成員,而不是函式的參數。


補充一下,大家有沒有想過為什麼 "類別變數名稱與函式參數相同" 常常發生,且在一些範例程式一再出現? 只要把函式參數(這裡我覺得使用 method parameter 字眼比較正確) 改成和類別變數名稱不同就避開必須用 this 明確指出變數不同的情況?

原因在於節省 name space 以增進源碼的可讀性,也就是減少源碼裡眾多不同變數名稱的個數。這也就是一些範例程式採用此方式的原因,我也建議此方式。


reply to postreply to post
I can do three things a day.
Study hard, Study hard, and Study hard.
作者 Re:給新手 - this 到底是什麼? [Re:caterpillar]
kao_kuei





發文: 3
積分: 0
於 2004-08-11 03:27 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
謝謝 !! 一下子之間清楚了許多 Smile

reply to postreply to post
Kuei ( kao_kuei )
www.kuei.idv.tw
作者 Re:給新手 - this 到底是什麼? [Re:caterpillar]
hackmo





發文: 9
積分: 0
於 2004-08-14 22:21 user profilesend a private message to usersend email to hackmoreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
了解,看完這篇文章之後,
了解了什麼是this了,謝謝。


reply to postreply to post
作者 Re:給新手 - this 到底是什麼? [Re:caterpillar]
kpeter6





發文: 5
積分: 0
於 2004-09-18 11:43 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
此外,this的用途可多了
在class中的constroctor中也可以使用
不過,我還是有些疑問
例如
1
2
3
4
5
6
7
8
9
10
11
12
public class Rectangle
{
  int width,heigh,x,y;
  public Rectangle()
  {
    this(0,0,0,0);//請問此this和物件的記憶體位置有關係嗎
  }
  public Rectangle(int width,int heigh,int x,int y)
  {
    this.x=x;this.y=y;this.width=width;this.heigh=heigh;
  }
}


kpeter6 edited on 2004-09-18 11:47
reply to postreply to post
作者 Re:給新手 - this 到底是什麼? [Re:caterpillar]
mocha





發文: 8
積分: 0
於 2006-03-14 10:44 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
你好
我不久前在新手區發了一個關於this的問題, 看了這篇後仍是不明白^^"
請問this在這句是指什麼?
public void receive(Packet p){
....
...
System.out.println(this.getName() + " forwards the packet " + "\"" + p.getData() + "\"" + " to " + nextNode.getName());
...
}

this的後面並不是一個variable, 這句也不是關於constructor overload...
請各位高手指點迷津 謝謝


reply to postreply to post
作者 Re:給新手 - this 到底是什麼? [Re:mocha]
bibigi





發文: 1
積分: 0
於 2006-04-05 19:50 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我也是新手...不過就我的認知對這個問題回覆...

這邊的this應該指的是你呼叫這個receive method的那個參考...
譬如你是在main裡面用

Object o=new Object();
o.receive( p );

在這個情況下,receive裡面的this,代表的就是o這個參考

第一次po文請多多指教

-------------------------------------------------------------------------------------------------------

mocha wrote:
你好
我不久前在新手區發了一個關於this的問題, 看了這篇後仍是不明白^^"
請問this在這句是指什麼?
public void receive(Packet p){
....
...
System.out.println(this.getName() + " forwards the packet " + "\"" + p.getData() + "\"" + " to " + nextNode.getName());
...
}

this的後面並不是一個variable, 這句也不是關於constructor overload...
請各位高手指點迷津 謝謝


reply to postreply to post
作者 Re:給新手 - this 到底是什麼? [Re:bibigi]
caterpillar

良葛格

版主

發文: 2613
積分: 70
於 2006-04-05 20:30 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
bibigi wrote:
在這個情況下,receive裡面的this,代表的就是o這個參考


正確的說法,應該是說this所參考的instance,就是o所參考的instance。。。


reply to postreply to post
良葛格學習筆記
作者 Re:給新手 - this 到底是什麼? [Re:caterpillar]
oldmemory

海無界、心有帆



發文: 95
積分: 2
於 2006-09-13 23:04 user profilesend a private message to usersend email to oldmemoryreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list

caterpillar wrote:

其實我們使用物件名稱來呼叫函式成員時,程式會將物件記憶體位址告知函式成員,而在函式中,一個類別資料成員其實會隱含一個this參考,這個this參考會儲存傳遞進來的物件記憶體位置,當我們呼叫getName()函式時,其實我們相當於執行:
1
2
3
public doublc getRadius() {
    return this.radius;
}



請教caterpillar大大,小弟看到這裡有個疑問,
是否所執行的指的是
1
2
3
public String getName() {
    return this.name; 
}

因為,覺得似乎有點怪怪的,好像有點文不對題,
不知我的疑問是否有誤,還請大大多多賜教!^^


reply to postreply to post
作者 Re:給新手 - this 到底是什麼? [Re:oldmemory]
caterpillar

良葛格

版主

發文: 2613
積分: 70
於 2006-09-13 23:11 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
啊…這邊的文章很舊了…更新的部份主要都放在我的網頁上…XD

reply to postreply to post
良葛格學習筆記
» JWorld@TW »  Java 新手區 » Object/物件導向

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8