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 數組初始化