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的重載)
這章歸納性有點強,彷佛力求將全部的初始化都說起了,因此應該之後還會返回來再看的吧。