thinkinginjava學習筆記04_初始化與清理

java沿用了c++的構造器,使用一個和類名徹底同樣的方法做爲類的構造器,能夠有多個構造器來經過不一樣的參數進行構造,稱爲重載;不只是構造器能夠重載,其餘方法也同樣經過不一樣的形參以及不一樣的返回值來實現重載;java

當建立一個新的對象的時候,java就須要對該對象進行初始化(若是沒有建立構造器,java會自動建立一個無參構造器,也稱默認構造器,並對對象進行初始化),構造器函數只對對象進行初始化操做,並無任何返回值(也不是返回void);python

java中區分兩個方法時,使用每一個方法的參數列表(包括參數的順序),參數列表的不一樣就會造成重載,方法的返回值不一樣一樣會造成重載;c++

當重載涉及到基本類型的時候,若是傳入的參數大小較小,則將自動轉成形參中較大的類型;優先使用相同基本類型形參的方法進行調用,若是找不到,則會使用比較大的形參方法進行調用,而且自動將傳入參數作相應的放大類型轉換;若是隻能找到較小的形參方法時,必須進行參數類型轉換(窄化轉換),不然編譯器將報錯;數組

若是類中沒有構造器,則java會自動建立一個默認構造器,若是定義了構造器,則java再也不建立默認構造器;函數

概念比較多,舉個重載方法的例子:學習

class Human{this

 

}spa

 

class Host extends Human{對象

 

}開發

 

class Stranger extends Human{

 

}

 

class Dog{

    void bark(Host h){

        System.out.println("She is wagging...");

    }

    void bark(Dog d){

        System.out.println("She is harking!");

    }

    void bark(Stranger s){

        System.out.println("She is howling!");

    }

}

 

public class TestInit {

    public static void main(String[] argv){

        Dog dog1 = new Dog();

        Dog dog2 = new Dog();

        Host h = new Host();

        Stranger s = new Stranger();

        dog1.bark(dog2);

        dog1.bark(h);

        dog1.bark(s);

    }

}/* output:

She is harking!

She is wagging...

She is howling!

*/

this關鍵字:如學習的感覺,java中方法不須要顯示的self(或者this)形參,this會再方法調用的時候自動傳入,所以,java的類中,若是沒有作其餘處理(好比加static等),都是對象方法;而且在java的類中,調用當前對象的其餘方法不須要顯示指定this.method(),(而且最好不要添加)編譯器會自動完成該工做,this的做用更可能是在對象傳遞的時候使用,好比返回當前對象以及將當前對象傳遞給其餘的方法;也能夠經過this在構造器中調用比較簡單的構造器來實現代碼複用;

this的使用總結起來就是,在只能經過this進行明確表示傳入該對象時才使用,不然都不要使用this;

經過static指定靜態方法,靜態方法不會傳入this;關於書上說靜態方法不「面向對象」,我認爲Ruby已經給出了答案,類自己也是對象,能夠將靜態對象看作是類的一個單件方法,該單件方法能夠被類調用,一樣也在該類實例化對象的祖先鏈中存在;惟一的不一樣可能就是不會傳入this了;

java中支持一個名爲finalize()的方法,該方法能夠在對象被回收前自動調用,至關於PHP中的__destructor(),一樣的,該方法並非析構方法,可是卻能夠經過該方法來檢查對象被回收時的狀態;

java中的垃圾回收並不是經過引用計數的方式(以前的猜想有誤),java具備多種回收機制,可是不包括引用計數的方式;具體方式有些複雜,之後有興趣再深究;

java中的局部變量必須初始化,不然將會以報錯的形式通知開發者,而類中的數據成員則會自動進行初始化;

數據成員初始化能夠直接指定,也能夠經過方法返回值,或者構造器來進行初始化;當二者同時進行時,變量會在方法(包括構造器)調用以前獲得初始化;

初始化順序:

靜態數據成員->數據成員->構造器;可是,靜態方法只在必要的時候纔會被初始化;

經過一個花括號,能夠對數據成員進行顯示的初始化,如:

static int i;
static{
    i = 47;
}

int j;
{
    j = 34;

數組初始化:

java中經過一個方括號定義基本類型數組,如:

int[] a1;

int a1[];

上面兩種形式具備相同的含義,數組經過一個花括號的列表進行初始化 ,如:

int a1[] = {1,2,3,4,5};

基本類型數組存在於棧中,和基本類型同樣,引用數組經過一個包裝器類型來定義:

Integer a2[] = new Integer[5];

引用數組並不是對象自己是一個引用,而是數組中的元素都是引用(對象),引用數組的定義相似:

Integer a2[] = {
    new Integer(1),
    new Integer(2),
    3,
};

在引用數組中,若是有基本數據類型,則會自動調用包裝器類型進行包裝,如上例的3;

不管是基本類型數組仍是引用數組,都有一個成員:length,顯示該數組的長度,當數組下標越界時,java會報錯;

經過設置一個數組參數,能夠實現方法的可變參數列表,而在Jave SE5以後,可變參數列表做爲特性使用,具體方式爲:

void aMethod(Object… args){

}

先指定可變參數列表的類型,而後緊跟三個點,接着是參數名稱;

有了該特性的支持,就不須要再顯式編寫數組語法來傳遞參數,然而當指定了可變參數列表時,java會自動地填充數組,而且若是傳入的是一個數組,java變不會繼續填充,而是直接使用該數組;(這樣的操做不知道是多餘仍是簡潔。。。)

因爲以上不太能理解的方式,因此可變列表的引用使得重載的過程變得複雜,必要時須要經過添加非可變參數來解決問題;(有點懷念python簡潔的語法了,儘管是數組,仍然會當成一個單一對象傳入,這樣更加容易理解而且避免不少問題,雖然python沒有java的重載)

這章歸納性有點強,彷佛力求將全部的初始化都說起了,因此應該之後還會返回來再看的吧。

相關文章
相關標籤/搜索