this 程序題

2021-04-16 17:17 更新

題目一

class Tester{
    int var;
    Tester(double var){this.var = (int)var};
    Tester(int var){this("hello");
    Tester(String s){
        this();
        System.out.println(s);
    }


    Tester(){ System.out.println("good-bye");}
}
 public static void main(String[] args)
         {
             Tester t = new Tester(5);
         }
     }

Tester t = new Tester(5) 的輸出是什么?

good-bye
hello

題目二

貌似和 this 無(wú)關(guān)但是很重要

public class Base { int i;
    Base(){
        add(1);
        System.out.println(i);
    }


    void add(int v){
        i+=v;
        System.out.println(i);
    }
}


public class MyBase extends Base{
    MyBase(){
        System.out.println("MyBase");
        add(2);
    }


    void add(int v){
        System.out.println("MyBase Add");
        i+=v*2;
        System.out.println(i);
    }
}


public class Test {
    public static void main(String[] args) {
        go(new MyBase());
    }


    static void go(Base b){
        b.add(8);
    }
}

輸出的結(jié)果是 22

子類(lèi)會(huì)首先調(diào)用父類(lèi)的構(gòu)造函數(shù),在父類(lèi)的構(gòu)造函數(shù) Base() 中執(zhí)行 add() 方法. 但這個(gè) add() 方法由于是在新建 MyBase 對(duì)象時(shí)調(diào)用的. 所以是執(zhí)行的 MyBase 中的 add 方法

在Java中,子類(lèi)的構(gòu)造過(guò)程中,必須 調(diào)用其父類(lèi)的構(gòu)造函數(shù), 是因?yàn)橛欣^承關(guān)系存在時(shí), 子類(lèi)要把父類(lèi)的內(nèi)容繼承下來(lái), 通過(guò)什么手段做到的? 這樣: 當(dāng)你new一個(gè)子類(lèi)對(duì)象的時(shí)候, 必須首先要new一個(gè)父類(lèi)的對(duì)像出來(lái), 這個(gè)父類(lèi)對(duì)象位于子類(lèi)對(duì)象的內(nèi)部, 所以說(shuō),子類(lèi)對(duì)象比父類(lèi)對(duì)象大, 子類(lèi)對(duì)象里面包含了一個(gè)父類(lèi)的對(duì)象, 這是內(nèi)存中真實(shí)的情況.

構(gòu)造方法是new一個(gè)對(duì)象的時(shí)候, 必須要調(diào)的方法, 這是規(guī)定, 要new父類(lèi)對(duì)象出來(lái), 那么肯定要調(diào)用其構(gòu)造方法, 所以 第一個(gè)規(guī)則:子類(lèi)的構(gòu)造過(guò)程中,必須 調(diào)用其父類(lèi)的構(gòu)造方法

一個(gè)類(lèi), 如果我們不寫(xiě)構(gòu)造方法, 那么編譯器會(huì)幫我們加上一個(gè)默認(rèn)的構(gòu)造方法, 所謂默認(rèn)的構(gòu)造方法, 就是沒(méi)有參數(shù)的構(gòu)造方法, 但是如果你自己寫(xiě)了構(gòu)造方法, 那么編譯器就不會(huì)給你添加了

所以有時(shí)候當(dāng)你new一個(gè)子類(lèi)對(duì)象的時(shí)候,肯定調(diào)用了子類(lèi)的構(gòu)造方法,但是在子類(lèi)構(gòu)造方法中我們并沒(méi)有顯示的調(diào)用基類(lèi)的構(gòu)造方法,就是沒(méi)寫(xiě),如:super(); 并沒(méi)有這樣寫(xiě),但是

第二個(gè)規(guī)則:如果子類(lèi)的構(gòu)造方法中沒(méi)有顯示的調(diào)用基類(lèi)構(gòu)造方法,則系統(tǒng)默認(rèn)調(diào)用基類(lèi)無(wú)參數(shù)的構(gòu)造方法

注意:如果子類(lèi)的構(gòu)造方法中既沒(méi)有顯示的調(diào)用基類(lèi)構(gòu)造方法,而基類(lèi)中又沒(méi)有默認(rèn)無(wú)參的構(gòu)造方法,則編譯出錯(cuò),所以,通常我們需要顯示的:super(參數(shù)列表),來(lái)調(diào)用父類(lèi)有參數(shù)的構(gòu)造函數(shù)

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)