JAVA編程思想 學習筆記

1 構造器

1)一旦創建一個對象(如 new Rock();),就會分配相應的存儲空間,並調用構造器。

解釋:(1)只有創建對象時,纔會調用構造器;

            (2)如果不是創建對象,只是創建句柄,那麼不會調用構造器?

 

2 重載方法

重載方法的區分:每個重載方法都必須採取獨一無二的自變量類型列表:

例子:

1)兩個函數的參數順序不一樣:可以區分重載方法

如:  static void print(String s, int i)

          static void print(int i, String)

參數順序不一樣,可以區分

注意:這種重載不推薦,因爲會產生難以維護的代碼。

 

 3主類型的重載

1)主類型:也即基本類型(如int ,long 等)

2)主類型重載時的注意事項:主類型能從一個較小的類型自動的轉變爲一個較大的類型

如果參數的類型比重載方法中參數的類型小,可以自動的轉化爲重載方法中參數的類型==>自動向大轉換

但是如果參數的類型比重載方法中參數的類型大,必須手動顯示轉換爲重載方法中的參數類型纔可以,否則會出現編譯錯誤。

例如

void print(char x);

void print(long x);

print(5);//5爲int,自動轉化爲long,調用print(long x)

void print(long x);

print(5);//此時5爲int,小於long,編譯出錯,應該寫成:print( (long)5);

 

4 不能使用返回值來區分重載方法

 

5 關於默認構造器

1)如果沒有定義構造器,編譯器會自動幫我們實現一個默認構造器;

2)如果定義了一個構造器,編譯器就不會幫我們事先默認構造器;

 

6 this指針

1)只能在方法內部使用;

2)常見使用點:(1)希望將句柄返回給當前對象;

                               (2)在構造器中調用構造器;

 

7 在構造器中使用this調用構造器

注意事項:

(1)儘管可用this指針調用一個構造器,但是不可調用兩個!

(2)此外,在一個構造器中,使用this調用另外一個構造器時,this構造器調用必須是第一句話,也即第一件事是調用構造器,然後才能做其他事情。

 例子:

 

Flower(int i) { print(i);}

Flower(String s {print(s);}

Flower(String s, int petals)

{

   this(petals);//使用this調用重載方法Flower(int i)

  //this(s);//嘗試使用this調用重載方法Flower(int i),==>不允許,因爲不能有兩個this調用,只能有一個!

this.s = s;//this的另外一個用法

}

 

8 清除

1)垃圾收集器只知道釋放那些由new分配的內存;

2)對於不是由new分配的內存,JAVA提供名爲finalize()的方法來清除這些內存;

3)垃圾收集器只和內存有關:業績垃圾回收期存在的唯一原因是爲了回收程序不再使用的內存;

 

9 成員初始化

1)在一個方法中的局部變量,不會被自動初始化:

例如:

  void f() {

       int i ;

       i++;

   }

會出現編譯錯誤,i沒有初始化就使用!

2)但是如果類的數據成員爲一個基本類型,會被自動初始化;

3)在一個類的內部定義一個對象句柄時,如果不將其初始化爲新對象,那麼這個句柄就會獲得一個空值;

 

 10 初始化

1)類定義中初始化:

JAVA中,可以在類內部定義變量的時候也爲其賦值,達到初始化的目的;==>  C++中不可以

==>這樣做的一個弊端是:每個對象都會獲得相同的初始化值;

2)構造器初始化:

 clas Counter {

    int i;

   Counter() { i = 7;}

//i會首先初始化爲0,然後初始化爲7

3)初始化順序:

(1)變量:在類中:初始化的順序是由變量在類中的定義順序決定的:即使變量定義大量遍佈於方法定義的中間,這些變量任然會在任何方法調用之前初始化---甚至是在構造器調用之前;

(2)類的變量的初始化先於構造器調用;

(3)靜態數據的初始化:(1)基本類型:自動獲得標準基本類型的初始值

                                               (2)指向對象的句柄:如果是新建一個對象,初始值爲該對象;否則爲空值(NULL)

 (4)初始化數據:

       首先爲static,然後是非static對象;

       static初始化只有在必要的時候纔會進行:如果不創建對應的類的對象,那麼永遠都不會初始化static;

 

例如:一個名爲Dog的類:

    (4.1)類型爲Dog的一個對象首次創建時,或者Dog類的static方法/static字段首次訪問時,Java解釋器必須找到Dog.class;

    (4.2)找到Dog.class後(它會創建一個Class對象),它的所有static初始化模塊都會運行

==>static初始化只發生一次,在Class對象首次載入的時候;

    (4.3)創建一個new Dog()時,Dog對象的構造過程,會現在內存堆(heap)中爲一個Dog對象分配足夠多的存儲空間;

    (4.4)該存儲空間會被清爲0,將Dog中所有基本類型設爲他們的默認值;

    (4.5)進行字段定義時,發生的初始化,(按照字段定義的順序,此時肯定就不包括static字段了)

     (4.6)執行構造器;

 

 (5)明確進行的靜態初始化:static構建從句(也叫 靜態塊)

  class Spoon { 

            static int i;

            static {  i  = 47; }

   ...

  }

==>和其他static初始化一樣,該static靜態塊,僅執行一次==>首次生成該類的一個對象,或者首次訪問屬於該類的一個static成員(即便從未生成該類的對象)

注意:只要類的一個static成員第一次被訪問,那麼其他所有的static都會執行初始化。

 

 >>>截止內容: 4.5 數組初始化

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章