重載: 如果多個方法(包含構造方法)有相同的名字、不同的參數,便產生重載。編譯器必須挑選出具體執行哪個方法,它通過用各個方法給出的參數類型與特定方法調用所使用的值類型進行匹配挑選出相對應的方法。 如果編譯器找不到匹配的參數,就會產生編譯時錯誤。(此過程稱為重載解析) 註意:方法的返回類型並不屬於重載 ...
重載:
如果多個方法(包含構造方法)有相同的名字、不同的參數,便產生重載。編譯器必須挑選出具體執行哪個方法,它通過用各個方法給出的參數類型與特定方法調用所使用的值類型進行匹配挑選出相對應的方法。
如果編譯器找不到匹配的參數,就會產生編譯時錯誤。(此過程稱為重載解析)
註意:方法的返回類型並不屬於重載的條件,因為不能有兩個名字相同、參數相同而返回類型不同的方法。否則會編譯報錯。我大學就是傻逼逼的一直把返回類型當做重載條件的一部分。
重載例子如下:
public class OverLoadingClass { String id; /*構造器重載*/ public OverLoadingClass(){ } public OverLoadingClass(String id){ this.id = id; } /*構造器重載*/ /*方法重載*/ public void Test(String name){ } public void Test(Integer age){ } /*方法重載*/ }
預設域初始化:
如果在構造器中沒有顯示的給實例域(全局變數)賦予初值,那麼就會被自動賦予預設值:數值的為0、布爾值為false、對象引用為null。
但是在局部變數中則不會自動初始化,若直接調用沒有初始化的局部變數則會編譯錯誤。
/** * 預設域初始化 */ public class DefaultInitialization { int id; //預設值為0 boolean flag; //預設值為false String name; //預設值為Null public void Test(){ int age; System.out.println(age);//編譯報錯 } }
無參數構造器:
如果在編寫一個類時沒有編寫構造器,那麼系統就會自動提供一個無參數的構造器。如果編寫了一個帶參數的構造器,系統則不會自動提供無參數的構造器。
一般在編寫了一個帶參數的構造器,都應該編寫多一個無參數的構造器。
顯示域初始化:
顯示域初始化,從文字上就可以知道,可以用眼睛看出他被初始化,並不是系統幫我們初始化(那是上面的預設域初始化了)。
/**
* 顯示域初始化 */ public class DisplayInitialization { int id = 666; String date = getDate(); public String getDate(){ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); return dateFormat.format(new Date()); } }
參數名
在創建帶參數的構造器時,參數變數用同樣的名字將實例域屏蔽起來。如果參數名為name,那麼在方法當中name將引用這個參數。而不是實例域,但是可以使用this關鍵字指向隱式參數(實例域),例:this.name
public class ParameterClass { String name; public ParameterClass(String name){ this.name = name; } }
在一般的程式開發當中應該都會這麼寫,當然,你也可以有下麵的操作(不怕被同事鄙視你代碼的話)
public class ParameterClass { String name; public ParameterClass(String n){ name = n; } }
這樣寫的話雖然是可以執行,但是可讀性並不好,所以代碼還是要規範一點的好。
調用另一個構造器
關鍵字this引用方法的隱式參數外,還能在構造器中調用其他的構造器,當然是同一個類的,別想太多。這樣的話對公共的構造器代碼部分只編寫一次即可。
/** * 調用其他構造器 */ public class CallOtherConstructor { public CallOtherConstructor(){ System.out.println("大胸弟,你來new我啦?"); } public CallOtherConstructor(String name){ this();//調用上面那個構造器 System.out.println(name+":對呀對呀,我來啦"); } }
初始化塊
除了在構造器中、聲明中賦值以外,java還有第三種機制,稱為初始化塊,在一個類的生命中,可以包含多個代碼塊。只要構造類的對象,這些塊就會被執行。
public class InitializationBlock { private Integer id; { id = 1; System.out.println("進入初始化塊"); } public static void main(String[] args){ InitializationBlock block1 = new InitializationBlock(); InitializationBlock block2 = new InitializationBlock(); } }
輸出結果:
進入初始化塊
進入初始化塊
在初始化對象的時,執行的順序為:聲明 -> 初始化塊 -> 構造器 而初始化塊一般比較少用,通常都會把初始化代碼放在構造器中。
靜態初始化塊則不同。靜態初始化塊在類的第一次載入的時候,將會進行靜態域的初始化。(註意:第一次載入類的時候才會執行,往後初始化此對象都不會再進入靜態初始化塊)
public class InitializationBlock { static{ System.out.println("進入靜態初始化塊"); } public static void main(String[] args){ InitializationBlock block1 = new InitializationBlock(); InitializationBlock block2 = new InitializationBlock(); } }
輸出結果:
進入靜態初始化塊
好了,這篇文章我大概寫了兩周,因為斷斷續續的在寫。當然,寫這麼多除了自己記住之外,也是為了大家能夠看懂。所以大伙能不能給我點個推薦呢?~~給點鼓勵我吧~謝謝大家的觀看~