Java類(lèi)執(zhí)行過(guò)程

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);
    }           
}
  1. 創(chuàng)建對(duì)象時(shí)
    Person person = new Person("nan");
  2. 在構(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)盡量遵從以下原則:

  1. 父類(lèi)成員盡可能使用private修飾
  2. 不要讓子類(lèi)隨意重寫(xiě)父類(lèi)的方法 父類(lèi)中的方法用final修飾時(shí)子類(lèi)則無(wú)法重寫(xiě)父類(lèi)方法.
  3. 盡可能不在父類(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)有被初始化,從而引起空指針異常.
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容