Thinking In Java第五章學習筆記

來源:互聯網
上載者:User

標籤:程式   中文   val   java   學習筆記   方法   賦值   而且   比較   

第五章:初始化與清理

  初始化和清理是涉及程式安全的兩個問題。Java構造器用於建立對象時的初始化,而記憶體回收行程則進行清理。

  構造器的名稱必須與類名一樣,雖然構造器是一種特殊的方法,但是每個方法首字母小寫編碼風格並不適合用於構造器。

  構造器是沒有傳回值的,但是new運算式卻返回了對建立對象的引用。

  方法重載是構造器所必須的。每個重載方法都必須獨一無二的參數列表。甚至參數順序的不同,也足以區分兩個方法。不過一般不建議這麼做,因為這會使代碼難以維護。當傳入的資料類型小於方法中聲明的形式參數類型,實際資料類型就會被提升。但是boolean不能轉換,char也比較特殊,提升至int。如果反過來,傳入大於聲明,則必須進行強轉,否則報錯。(注意,根據傳回值的不同來區分方法是不成立的。)

  各參數類型大小順序排列:boolean:1/8;byte:1;char:2(一個字元可以儲存一個中文漢字);short:2;int:4;float:4;long:8;double:8。(單位:位元組)

  this關鍵字:只能在方法內部使用,表示對"調用方法的那個對象"的引用。只有在需要明確指出對當前對象的引用時,才有必要使用this。如果在方法內部使用同一個類中的另一個方法,就不用使用this。return this表示返回當前引用。

  通常寫this的時候,都是指"這個對象"或者"那個對象",而且它本身表示對當前對象的引用。在構造器中,如果this添加了參數列表,那麼就有了不同的含義。這將產生對符合此參數列表的某個構造器的明確調用。通過下面的程式碼範例將會理解的更加深刻。

public class Flower {int petalCount = 0;String s = "initial value";Flower(int petals){petalCount = petals;System.out.println("Constructor w/ int arg only,petalCount=" + petalCount);}Flower(String ss){System.out.println("Constructor w/ String arg only,s=" + ss);s = ss;}Flower(String s,int petals){this(petals);
         //this(s)//錯誤,不能在一個構造器裡面調用兩次構造器this.s = s;//因為成員名字和參數S的名稱一致,所有採用這種寫法加以區分。System.out.println("String & int args");}Flower(){this("hi",47);System.out.println("default constructor(no args)");}void printPetalCount(){
         //this(11);//錯誤,不能在非構造器方法裡通過this調用構造器。System.out.println("petalCount =" + petalCount + " s=" + s);}public static void main(String[] args){Flower x = new Flower();x.printPetalCount();}}

output:

Constructor w/ int arg only,petalCount=47String & int argsdefault constructor(no args)petalCount =47 s=hi

 關於static的補充:

  static方法不能包含this,即不能調用非靜態方法。反過來倒是可以。而且在沒有建立對象的時候,單依靠對象本身就可以對static方法進行調用。這實際上是static的主要作用。這很像全域方法,Java中禁止使用全域方法,但你在類中置入static方法,就可以訪問其他的static方法和static域。

  有些人認為static方法不是"物件導向"的,因為他們的確具有全域函數的含義,使用static方法時,由於並不是通過this來向對象發送資訊。的確,要是代碼中存在大量的static,就應該重新考慮自己的設計。然而static的概念有其實用之處,許多時候都要用到它,至於是不是物件導向,不是我們說了算的。

  關於終結處理和記憶體回收,將在後面的博文中詳細介紹。

  Java儘力保證:所有變數在使用前必須得到恰當的初始化。

  對於類中基本成員(即欄位)是基本類型的,會自動為這些成員初始化。但是方法中的局部變數則不會,必須強製程序員賦予初始值,否則編譯報錯。

  成員初始化的三種情況:

  (1)類中基本成員變數:直接在定義的地方為其賦值。(C++中不可以)

  (2)非基本類型的對象:

class Depth{}public class Measurement {Depth d = new Depth();}

   (3)通過調用某個方法來提供初值,這個方法也可以帶有參數,但是這些參數必須是應景被初始化了的:

public calss MethodInit2{int i = f();int j = g(i);int f(){return 11;}int g(int n){return n * 10;}}

Thinking In Java第五章學習筆記

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.