1. 對(duì)象的創(chuàng)建由什么完成
- 實(shí)際通過(guò)調(diào)用該類(lèi)的有參或無(wú)參構(gòu)造方法創(chuàng)建對(duì)象,但對(duì)象的創(chuàng)建并不由構(gòu)造器完成.實(shí)際上通過(guò)new關(guān)鍵字調(diào)用構(gòu)造方法時(shí),系統(tǒng)在執(zhí)行構(gòu)造方法前會(huì)為該對(duì)象分配內(nèi)存空間,并為這個(gè)對(duì)象執(zhí)行默認(rèn)初始化,此時(shí)該對(duì)象已經(jīng)創(chuàng)建完成,然后通過(guò)構(gòu)造器將該對(duì)象返回.
- 構(gòu)造器無(wú)需指定返回類(lèi)型,但并不是沒(méi)有返回類(lèi)型,實(shí)際返回的當(dāng)前對(duì)象類(lèi)型,如果沒(méi)有返回類(lèi)型則完全可以使用void返回關(guān)鍵字.
2. 構(gòu)造方法什么時(shí)候會(huì)調(diào)用
public class Person{
private String name;
private int age;
public Person(String name){
this(name,0);/**!!!**/
System.out.println(name);
}
public Person(String name,int age){
System.out.println(name+""+age);
}
}
- 創(chuàng)建對(duì)象時(shí)
Person person = new Person("nan"); - 在構(gòu)造方法中調(diào)用另外一個(gè)構(gòu)造方法
如上 this(name,0);
該調(diào)用必須位于構(gòu)造方法內(nèi),并且必須位于首行且只能調(diào)用一次。 如果沒(méi)有指定的話構(gòu)造方法默認(rèn)首行為super(),去調(diào)用父類(lèi)的無(wú)參構(gòu)造方法,如果指定了this(),或者super,則系統(tǒng)不會(huì)添加。
3. 子類(lèi)與父類(lèi)
子類(lèi)中擁有父類(lèi)的變量和方法,包括靜態(tài)成員和靜態(tài)方法
- 靜態(tài)成員變量和父類(lèi)中的相同時(shí):子類(lèi)覆蓋父類(lèi),則相當(dāng)于各自分別有個(gè)變量
- 成員變量和父類(lèi)中的相同時(shí):子類(lèi)覆蓋父類(lèi),如果要在子類(lèi)中訪問(wèn)父類(lèi)中的該變量時(shí)則需使用super關(guān)鍵字
- 成員方法和父類(lèi)中成員方法名和參數(shù)列表相同時(shí):此時(shí)為重寫(xiě),如果要在子類(lèi)中訪問(wèn)父類(lèi)的該方法時(shí)可使用super關(guān)鍵字
- 子類(lèi)構(gòu)造器中調(diào)用父類(lèi)的構(gòu)造器時(shí)使用super(...)調(diào)用,而且必須放首行,且只能調(diào)用一次.
注意
子類(lèi)不能繼承和重寫(xiě)父類(lèi)的構(gòu)造方法,而是采用隱式調(diào)用父類(lèi)的構(gòu)造方法 ,即如果子類(lèi)沒(méi)有顯示調(diào)用父類(lèi)的構(gòu)造方法,系統(tǒng)會(huì)自動(dòng)加入super()方法,該方法會(huì)去調(diào)用父類(lèi)的無(wú)參構(gòu)造方法,如果父類(lèi)沒(méi)有指定無(wú)參構(gòu)造方法(系統(tǒng)自動(dòng)添加,手動(dòng)添加均可),則編譯錯(cuò)誤.如果顯示調(diào)用父類(lèi)構(gòu)造方法,則系統(tǒng)不會(huì)隱式調(diào)用。
4. 子類(lèi)繼承父類(lèi)引起的問(wèn)題
破壞了父類(lèi)的封裝性,造成子類(lèi)和父類(lèi)的嚴(yán)重耦合. //子類(lèi)可以直接訪問(wèn)父類(lèi)的成員以及方法并重寫(xiě)
為了避免這些問(wèn)題在設(shè)計(jì)父類(lèi)時(shí)應(yīng)盡量遵從以下原則:
- 父類(lèi)成員盡可能使用private修飾
- 不要讓子類(lèi)隨意重寫(xiě)父類(lèi)的方法 父類(lèi)中的方法用final修飾時(shí)子類(lèi)則無(wú)法重寫(xiě)父類(lèi)方法.
- 盡可能不在父類(lèi)中調(diào)用可能被子類(lèi)重寫(xiě)的方法. // 因?yàn)樽宇?lèi)重寫(xiě)的方法有可能調(diào)用了自己類(lèi)的一些成員,系統(tǒng)在初始化對(duì)象時(shí)先初始化父類(lèi),從而導(dǎo)致空指針異常
class Base{
public Base(){
test();
}
public void test(){
System.out.println("父類(lèi)中的test方法");
}
}
class Sub extends Base{
private String name;
public void test(){
System.out.println("Sub name length:"+name.length());
}
public static void main(String[]args){
Sub sub = new Sub();//會(huì)引起空指針異常,首先會(huì)執(zhí)行父類(lèi)的無(wú)參構(gòu)造方法,并調(diào)用test()方法,由于實(shí)際對(duì)象為Sub,則根據(jù)多態(tài)會(huì)調(diào)用子類(lèi)重寫(xiě)的test方法,又因?yàn)樽宇?lèi)name變量還沒(méi)有被初始化,從而引起空指針異常.
}
}