Java面向?qū)ο?--構(gòu)造器(Constructor),this關(guān)鍵字

構(gòu)造器(Constructor)

創(chuàng)建一個(gè)對(duì)象時(shí),我們會(huì)寫如下的代碼:
User user = new User();
有同學(xué)可能會(huì)認(rèn)為new右邊寫是類型User的類名,但是實(shí)際上這里調(diào)用的是一個(gè)方法。
該方法用來創(chuàng)建一個(gè)類型的實(shí)例玫恳,因?yàn)樗且粋€(gè)很特殊的方法,我們稱之為構(gòu)造方法/構(gòu)造器/構(gòu)造函數(shù)(Constructor)。

構(gòu)造器的作用

構(gòu)造器的作用:可用于創(chuàng)建實(shí)例象和完成實(shí)例初始化時(shí)內(nèi)存分配鳞绕。
注意:如果在構(gòu)造器中沒有顯示地給域賦初值,那么就會(huì)被自動(dòng)賦予默認(rèn)值,這和動(dòng)態(tài)創(chuàng)建數(shù)值是元素的默認(rèn)值是一樣的:數(shù)值為0,布爾值為flase,對(duì)象引用為null.

構(gòu)造器的特點(diǎn):

1.構(gòu)造方法名稱與類名相同:這樣我們才知道當(dāng)前創(chuàng)建的是哪個(gè)類型的實(shí)例。
2.不用定義返回值類型
3.不需要寫return語句
4.和類的修飾符相同:如果類前使用了public修飾,則構(gòu)造器也要使用public修飾

//構(gòu)造器
public class ConstructorDemo {
    //調(diào)用構(gòu)造器創(chuàng)建User類的實(shí)例對(duì)象
    User user = new User();

}

class User{
    private String name;
    private int age;
}

疑問:上述代碼,并沒有在User類中看到構(gòu)造器的定義尸曼,調(diào)用構(gòu)造器也能成功new一個(gè)User對(duì)象,這是為什么呢?

默認(rèn)構(gòu)造器

當(dāng)一個(gè)類中沒有顯示定義構(gòu)造器時(shí),那么編譯器會(huì)默認(rèn)給該類提供一個(gè)構(gòu)造器们何,其特點(diǎn)是:無參、無方法體控轿、訪問修飾符和所在類的訪問修飾符相同冤竹。
注意:僅當(dāng)類沒有提供任何構(gòu)造器時(shí),系統(tǒng)才會(huì)提供一個(gè)默認(rèn)的構(gòu)造器,此時(shí),該默認(rèn)構(gòu)造器是可以通過查看編譯之后的代碼看到的,(可以使用XJad查看).

構(gòu)造器重載

我們說,方法可以重載, 這解決了同一種功能的方法因?yàn)閰?shù)列表不同,而帶來方法名稱不同的問題.而構(gòu)造器是一種特殊的方法,那么構(gòu)造器自然也是可以重載的.
值得注意的是,如果在編寫類的時(shí)候給出了構(gòu)造器,那么系統(tǒng)就不會(huì)在提供默認(rèn)構(gòu)造器

//構(gòu)造器
public class ConstructorDemo {
    public static void main(String[] args) {
        //調(diào)用構(gòu)造器創(chuàng)建User類的實(shí)例對(duì)象
        //User user = new User();//報(bào)錯(cuò) :The constructor User() is undefined
        //注意:如果在編寫類的時(shí)候給出了構(gòu)造器,那么系統(tǒng)就不會(huì)在提供默認(rèn)構(gòu)造器,如果還想使用無參構(gòu)造器,可以自己添加一個(gè)
        User user1 = new User("ShenJN");//調(diào)用了一個(gè)參數(shù)的構(gòu)造器
        User user2 = new User("ShenJN", 11);//調(diào)用了兩個(gè)參數(shù)的構(gòu)造器
    }
}

class User {
    private String name;
    private int age;

    User(String n) {
        name = n;
        System.out.println("調(diào)用了一個(gè)參數(shù)的構(gòu)造器");
    }

    User(String n, int a) {
        name = n;
        age = a;
        System.out.println("調(diào)用了兩個(gè)參數(shù)的構(gòu)造器");

    }
}

上述代碼,有一個(gè)地方令我很不爽,在構(gòu)造器的變量名很不直觀,我想這樣寫代碼

class User {
    private String name;
    private int age;

    User(String name, int age) {
        name = name;
        age = age;
        System.out.println("調(diào)用了兩個(gè)參數(shù)的構(gòu)造器");

    }
}

但是,這樣寫肯定是有問題的則,構(gòu)造器中name和age的值根本沒有傳給User類的字段,而是自己賦值給了自己,那要怎么解決呢?解決方案,可以使用this關(guān)鍵字.

什么是this

this:表示當(dāng)前對(duì)象,哪個(gè)對(duì)象調(diào)用this所在的成員茬射,那么this就表示哪個(gè)對(duì)象.
一般的this出現(xiàn)在兩個(gè)地方:
1.構(gòu)造器中:表示當(dāng)前構(gòu)造器創(chuàng)建的對(duì)象鹦蠕。
2.方法中:表示當(dāng)前調(diào)用this所在方法的對(duì)象。

this的作用:

1.解決成員變量和參數(shù)之間的二義性,必須使用;
2.同類中實(shí)例方法間互調(diào)
3.將當(dāng)前對(duì)象作為參數(shù)傳遞給另一個(gè)方法
3.講當(dāng)前對(duì)象作為方法的返回值
4.構(gòu)造器重載的互調(diào)在抛,this([參數(shù)])必須寫在構(gòu)造方法第一行
注意:static不能和this一起使用

class User {
    private String name;
    private int age;
   //解決剛剛的上述問題
    User(String name) {
        this.name = name;
        System.out.println("調(diào)用了一個(gè)參數(shù)的構(gòu)造器");
    }
    //解決剛剛的上述問題
    User(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("調(diào)用了兩個(gè)參數(shù)的構(gòu)造器");

    }
}

上述代碼沒有問題,但是存在了代碼重復(fù)的問題this.age = age;
注意:當(dāng)有多個(gè)構(gòu)造器或者重載方法時(shí),我們一般使用少參數(shù)的方法調(diào)用多參數(shù)的方法,參數(shù)越多,該方法考慮的因素也就越多,功能也更強(qiáng)大.
但是,在構(gòu)造器中調(diào)用重載構(gòu)造器,只能放在構(gòu)造方法第一行

class User {
    private String name;
    private int age;
    //解決上述問題
    User(String name) {
        //在構(gòu)造器中調(diào)用重載構(gòu)造器,只能放在構(gòu)造方法第一行;
        this(name,0);
        System.out.println("調(diào)用了一個(gè)參數(shù)的構(gòu)造器");
    }

    User(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("調(diào)用了兩個(gè)參數(shù)的構(gòu)造器");

    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末钟病,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子刚梭,更是在濱河造成了極大的恐慌肠阱,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件望浩,死亡現(xiàn)場(chǎng)離奇詭異辖所,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)磨德,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門缘回,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吆视,“玉大人,你說我怎么就攤上這事酥宴±舶桑” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵拙寡,是天一觀的道長(zhǎng)授滓。 經(jīng)常有香客問我,道長(zhǎng)肆糕,這世上最難降的妖魔是什么般堆? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮诚啃,結(jié)果婚禮上淮摔,老公的妹妹穿的比我還像新娘。我一直安慰自己始赎,他們只是感情好和橙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著造垛,像睡著了一般魔招。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上五辽,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天办斑,我揣著相機(jī)與錄音,去河邊找鬼奔脐。 笑死俄周,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的髓迎。 我是一名探鬼主播峦朗,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼排龄!你這毒婦竟也來了波势?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤橄维,失蹤者是張志新(化名)和其女友劉穎尺铣,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體争舞,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凛忿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了竞川。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片店溢。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡叁熔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出床牧,到底是詐尸還是另有隱情荣回,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布戈咳,位于F島的核電站心软,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏著蛙。R本人自食惡果不足惜删铃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望册踩。 院中可真熱鬧泳姐,春花似錦、人聲如沸暂吉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽慕的。三九已至,卻和暖如春挤渔,著一層夾襖步出監(jiān)牢的瞬間肮街,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國打工判导, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嫉父,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓眼刃,卻偏偏與公主長(zhǎng)得像绕辖,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子擂红,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容