熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Javascript >> 正文

this關鍵字

2013-11-23 17:57:32  來源: Javascript 

  如果有兩個同類型的對象分別叫作a和b那麼您也許不知道如何為這兩個對象同時調用一個f()方法
  class Banana { void f(int i) { /* */ } }
  Banana a = new Banana() b = new Banana();
  af();
  bf();
    若只有一個名叫f()的方法它怎樣才能知道自己是為a還是為b調用的呢?
    為了能用簡便的面向對象的語法來書寫代碼——亦即將消息發給對象編譯器為我們完成了一些幕後工作其中的秘密就是第一個自變量傳遞給方法f()而且那個自變量是准備操作的那個對象的句柄所以前述的兩個方法調用就變成了下面這樣的形式
  Bananaf(a);
  Bananaf(b);
    這是內部的表達形式我們並不能這樣書寫表達式並試圖讓編譯器接受它但是通過它可理解幕後到底發生了什麼事情
    假定我們在一個方法的內部並希望獲得當前對象的句柄由於那個句柄是由編譯器秘密傳遞的所以沒有標識符可用然而針對這一目的有個專用的關鍵字thisthis關鍵字(注意只能在方法內部使用)可為已調用了其方法的那個對象生成相應的句柄可象對待其他任何對象句柄一樣對待這個句柄但要注意假若准備從自己某個類的另一個方法內部調用一個類方法就不必使用this只需簡單地調用那個方法即可當前的this句柄會自動應用於其他方法所以我們能使用下面這樣的代碼
  class Apricot {
  void pick() { /* */ }
  void pit() { pick(); /* */ }
  }
    在pit()內部我們可以說thispick()但事實上無此必要編譯器能幫我們自動完成this關鍵字只能用於那些特殊的類——需明確使用當前對象的句柄例如假若您希望將句柄返回給當前對象那麼它經常在return語句中使用
    由於increment()通過this關鍵字返回當前對象的句柄所以可以方便地對同一個對象執行多項操作
   在構建器裡調用構建器
    若為一個類寫了多個構建器那麼經常都需要在一個構建器裡調用另一個構建器以避免寫重復的代碼可用this關鍵字做到這一點
  通常當我們說this的時候都是指這個對象或者當前對象而且它本身會產生當前對象的一個句柄在一個構建器中若為其賦予一個自變量列表那麼this關鍵字會具有不同的含義它會對與那個自變量列表相符的構建器進行明確的調用這樣一來我們就可通過一條直接的途徑來調用其他構建器如下所示
    其中構建器Flower(String sint petals)向我們揭示出這樣一個問題盡管可用this調用一個構建器但不可調用兩個除此以外構建器調用必須是我們做的第一件事情否則會收到編譯程序的報錯信息
    這個例子也向大家展示了this的另一項用途由於自變量s的名字以及成員數據s的名字是相同的所以會出現混淆為解決這個問題可用thiss來引用成員數據經常都會在Java代碼裡看到這種形式的應用本書的大量地方也采用了這種做法
  在print()中我們發現編譯器不讓我們從除了一個構建器之外的其他任何方法內部調用一個構建器
   static的含義
    理解了this關鍵字後我們可更完整地理解static(靜態)方法的含義它意味著一個特定的方法沒有this我們不可從一個static方法內部發出對非static方法的調用(注釋②)盡管反過來說是可以的而且在沒有任何對象的前提下我們可針對類本身發出對一個static方法的調用事實上那正是static方法最基本的意義它就好象我們創建一個全局函數的等價物(在C語言中)除了全局函數不允許在Java中使用以外若將一個static方法置入一個類的內部它就可以訪問其他static方法以及static字段
    ②有可能發出這類調用的一種情況是我們將一個對象句柄傳到static方法內部隨後通過句柄(此時實際是this)我們可調用非static方法並訪問非static字段但一般地如果真的想要這樣做只要制作一個普通的非static方法即可
    有些人抱怨static方法並不是面向對象因為它們具有全局函數的某些特點利用static方法我們不必向對象發送一條消息因為不存在this這可能是一個清楚的自變量若您發現自己使用了大量靜態方法就應重新思考自己的策略然而static的概念是非常實用的許多時候都需要用到它所以至於它們是否真的面向對象應該留給理論家去討論事實上即使Smalltalk在自己的類方法裡也有類似於static的東西

From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25422.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.