亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java中你真的會(huì)用Constructor構(gòu)造器嗎之看完本篇你就真的會(huì)了

 更新時(shí)間:2021年09月22日 09:26:44   作者:YXXYX  
顯式初始化要求我們?cè)趯懗绦驎r(shí)就確定初始值,這有時(shí)很不方便。我們可以使用構(gòu)造器(constructor)來初始化對(duì)象。構(gòu)造器可以初始化數(shù)據(jù)成員,還可以規(guī)定特定的操作。這些操作會(huì)在創(chuàng)建對(duì)象時(shí)自動(dòng)執(zhí)行。下面文字將對(duì)該內(nèi)容做詳細(xì)介紹,需要的小伙伴請(qǐng)參考

引言

相信大家對(duì)于java里的構(gòu)造器應(yīng)該都是有了解的,這次我們來了解一些構(gòu)造器的不同使用方式,了解構(gòu)造器的調(diào)用順序,最后可以靈活的在各種情況下定義使用構(gòu)造器,進(jìn)一步優(yōu)化我們的代碼;

構(gòu)造器簡(jiǎn)介

還是簡(jiǎn)單介紹一下構(gòu)造器到底是什么吧,
構(gòu)造器是類中一種特殊的方法,通過調(diào)用構(gòu)造器來完成對(duì)象的創(chuàng)建,以及對(duì)象屬性的初始化操作。

構(gòu)造器定義方式:

[修飾符列表] 構(gòu)造器名(形式參數(shù)列表){
     構(gòu)造方法體;
 }

構(gòu)造器有以下幾個(gè)特點(diǎn):

  • 構(gòu)造器名和類名一致;
  • 構(gòu)造器用來創(chuàng)建對(duì)象,以及完成屬性初始化操作;
  • 構(gòu)造器返回值類型不需要寫,包括 void 也不能寫
  • 構(gòu)造器的返回值類型實(shí)際上是當(dāng)前類的類型
  • 一個(gè)類中可以定義多個(gè)構(gòu)造器,這些構(gòu)造器構(gòu)成方法重載

構(gòu)造器的使用其實(shí)很常見,調(diào)用語(yǔ)法為:new 構(gòu)造器名(實(shí)際參數(shù)列表) ,假如我們現(xiàn)在有一個(gè)Person類,調(diào)用默認(rèn)構(gòu)造器:

Person p = new Person(); // 這里的Person()其實(shí)就是調(diào)用的默認(rèn)構(gòu)造器??!

構(gòu)造器的使用需要注意:
當(dāng)一個(gè)類沒有顯式的定義任何構(gòu)造器的時(shí)候,系統(tǒng)默認(rèn)提供無參數(shù)構(gòu)造器,當(dāng)顯式的定義構(gòu)造器之后,系統(tǒng)不再提供無參數(shù)構(gòu)造器。無參數(shù)構(gòu)造器又叫做缺省構(gòu)造器,或默認(rèn)構(gòu)造器;

構(gòu)造器重載

雖然系統(tǒng)會(huì)給我們提供默認(rèn)構(gòu)造器并賦予初始值,我們自己也可以顯式的指定初始值,但是可不可以多種構(gòu)造器同時(shí)存在一個(gè)類中呢?
這就需要重載構(gòu)造器,因?yàn)闃?gòu)造器也是方法的一種,方法都可以重載,構(gòu)造器當(dāng)然也可以;
構(gòu)造器重載方式和方法重載差不多,只需要構(gòu)造器名相同,參數(shù)列表不同就可以了;

測(cè)試代碼:

public class ConstructorOverloadTest {
    String name;
    int age;

    // 默認(rèn)構(gòu)造器(無參構(gòu)造器)
    ConstructorOverloadTest() {}
    // 含參構(gòu)造器 重載版
    ConstructorOverloadTest(String myName, int myAge) {
        this.name = myName;
        this.age = myAge;
    }
    public static void main(String[] args) {
        // 調(diào)用無參構(gòu)造器
        var p1 = new ConstructorOverloadTest();
        System.out.println("p1的初始化結(jié)果為:");
        System.out.println("姓名 :" + p1.name); 
        System.out.println("年齡:" + p1.age);
        // 調(diào)用有參構(gòu)造器
        var p2 = new ConstructorOverloadTest("張三", 18);
        System.out.println("p2的初始化結(jié)果為:");
        System.out.println("姓名 :" + p2.name); 
        System.out.println("年齡:" + p2.age);
    }
}

輸出結(jié)果為:

p1的初始化結(jié)果為:
姓名 :null
年齡:0
p2的初始化結(jié)果為:
姓名 :張三
年齡:18

當(dāng)然這里只寫了一個(gè)重載版本,還可以定義多個(gè)重載版本,這里就不列舉了;我們只需要能夠根據(jù)實(shí)際情況使用恰當(dāng)?shù)闹剌d就可以了,不用都寫出來;

構(gòu)造器間的相互調(diào)用

如果系統(tǒng)中有多個(gè)構(gòu)造器,并且我們想要通過一個(gè)構(gòu)造器A調(diào)用另一個(gè)構(gòu)造器B,該怎么辦?
可能有人會(huì)想到調(diào)用構(gòu)造器肯定要?jiǎng)?chuàng)建一個(gè)對(duì)象啊,所以直接new一個(gè)不就可以了嘛; 但是我們通過一個(gè)構(gòu)造器調(diào)用另一個(gè)構(gòu)造器的目的就是為了簡(jiǎn)化代碼的,這樣反而又多此一舉了;
如果不new一個(gè)新的對(duì)象,那么我們可以通過 this引用 來調(diào)用相應(yīng)的構(gòu)造器;

還是不太明白?看看下面的代碼!
測(cè)試代碼如下:

public class ConstructorTest01 {
    public static void main(String[] args) {
        // 調(diào)用兩個(gè)參數(shù)的構(gòu)造器
        Person p1 = new Person("張三", 18);
        System.out.println("兩個(gè)參數(shù)的構(gòu)造器初始化結(jié)果為:");
        System.out.println("姓名:" + p1.name);
        System.out.println("身份證號(hào):" + p1.idNum);
        System.out.println("年齡:" + p1.age);

        // 調(diào)用三個(gè)參數(shù)的構(gòu)造器
        Person p2 = new Person("李四", "6666666", 20);
        System.out.println("三個(gè)參數(shù)的構(gòu)造器初始化結(jié)果為:");
        System.out.println("姓名:" + p2.name);
        System.out.println("身份證號(hào):" + p2.idNum);
        System.out.println("年齡:" + p2.age);
    }
}
class Person {
    String name;
    String idNum;
    int age;

    // 有兩個(gè)參數(shù)的構(gòu)造器
    Person(String myName, int myAge) {
        this.name = myName;
        this.age = myAge;
    }
    // 有三個(gè)參數(shù)的構(gòu)造器
    Person(String myName, String myIdNum, int myAge) {
        // 通過this調(diào)用兩個(gè)參數(shù)的構(gòu)造器
        this(myName, myAge);
        this.idNum = myIdNum;
    }
}

輸出結(jié)果為:

兩個(gè)參數(shù)的構(gòu)造器初始化結(jié)果為:
姓名:張三
身份證號(hào):null
年齡:18
三個(gè)參數(shù)的構(gòu)造器初始化結(jié)果為:
姓名:李四
身份證號(hào):6666666
年齡:20

通過this調(diào)用有一點(diǎn)需要注意:
使用this調(diào)用另一個(gè)重載的構(gòu)造器只能在構(gòu)造器中使用,且必須作為構(gòu)造器執(zhí)行體的第一條語(yǔ)句

可能有人會(huì)問:如果在有三個(gè)參數(shù)的構(gòu)造器里面不用this指針,而是直接把上一個(gè)構(gòu)造器的代碼復(fù)制過來不行嗎?
當(dāng)然可以,但是不建議;我們得知道為什么要存在this這個(gè)調(diào)用構(gòu)造器的方法,它不是無緣無故存在的;在軟件開發(fā)時(shí)有一個(gè)原則:不要把相同代碼重復(fù)寫兩次以上;因?yàn)橐坏┮粋€(gè)構(gòu)造器內(nèi)的初始代碼需要修改,那么很有可能其他的構(gòu)造器初始代碼也要跟著修改,如果構(gòu)造版本多的話是非常麻煩的;而使用this恰恰可以避免這個(gè)問題,只需要修改一個(gè)地方,其他幾個(gè)構(gòu)造器就隨著更改了;這樣的代碼不僅更加簡(jiǎn)潔,而且降低了維護(hù)成本;

子類構(gòu)造器調(diào)用父類構(gòu)造器

繼承有一個(gè)規(guī)則是:當(dāng)繼承發(fā)生后,子類不會(huì)獲得父類的構(gòu)造器;
但是子類的構(gòu)造器可以通過一定方法區(qū)調(diào)用父類構(gòu)造器,類似于通過this引用調(diào)用重載的構(gòu)造器;
而子類構(gòu)造器調(diào)用父類的構(gòu)造器不用this關(guān)鍵字,這里有一個(gè)新的關(guān)鍵字:super

super和this用法差不多,使用它就可以實(shí)現(xiàn)子類構(gòu)造器調(diào)用父類的構(gòu)造器;

看個(gè)代碼就明白了:
測(cè)試代碼:

class Person {
    String name;
    int age;
    // 父類的構(gòu)造函數(shù)
    Person(String myName, int myAge) {
        this.name = myName;
        this.age = myAge;
    }
}
public class Kids extends Person{
    String school;
    // 子類的構(gòu)造函數(shù)
    Kids(String myName, int myAge, String mySchool) {
        // 通過super來調(diào)用父類構(gòu)造器初始化過程
        super(myName, myAge);
        this.school = mySchool;
    }
    public static void main(String[] args) {
        Kids k = new Kids("張三", 5, "奧特曼小學(xué)");
        System.out.println("name:" + k.name);
        System.out.println("age:" + k.age);
        System.out.println("school:" + k.school);
    }
}

輸出結(jié)果為:

name:張三
age:5
school:奧特曼小學(xué)

通過代碼可以看出來super確實(shí)和this非常像,無非就是super調(diào)用父類構(gòu)造器,this調(diào)用同一個(gè)類的重載的構(gòu)造器;
且使用super也需要注意:
super調(diào)用父類構(gòu)造器也必須在子類構(gòu)造器執(zhí)行體的第一行,所以this和super不會(huì)同時(shí)出現(xiàn);

構(gòu)造器的調(diào)用順序

這里先看一個(gè)代碼:

class Creature {
    Creature() {
        System.out.println("Creature的無參構(gòu)造器的調(diào)用");
    }
}
class Person extends Creature {
    Person(String name) {
        System.out.println("Person的一個(gè)參數(shù)構(gòu)造器的調(diào)用");
    }
    Person(String name, int age) {
        // this調(diào)用同一個(gè)類中重載的構(gòu)造器
        this(name);
        System.out.println("Person的兩個(gè)參數(shù)構(gòu)造器的調(diào)用");
    }
}
public class Kids02 extends Person {
    Kids02() {
        // 顯式調(diào)用父類的兩個(gè)參數(shù)的構(gòu)造器
        super("張三", 18);
        System.out.println("Kids02的無參構(gòu)造器的調(diào)用");
    }
    public static void main(String[] args) {
        // 創(chuàng)建一個(gè)Kids02對(duì)象
        new Kids02();
    }
}

這個(gè)代碼中,Person類繼承了Creature類,Kids02類繼承了Person類,Perosn類中又通過this調(diào)用同一個(gè)類中重載的構(gòu)造器,
Kids02類中用super 顯式調(diào)用父類的兩個(gè)參數(shù)的構(gòu)造器;
那么輸出是什么呢?到底先調(diào)用的是誰的構(gòu)造器,最后調(diào)用的誰的構(gòu)造器?

輸出如下:

Creature的無參構(gòu)造器的調(diào)用
Person的一個(gè)參數(shù)構(gòu)造器的調(diào)用
Person的兩個(gè)參數(shù)構(gòu)造器的調(diào)用
Kids02的無參構(gòu)造器的調(diào)用

通過這個(gè)代碼和結(jié)果,可以總結(jié)出來,父類構(gòu)造器總在子類構(gòu)造器之前執(zhí)行,或者可以說:
創(chuàng)建任何對(duì)象總是從該類所在繼承樹最頂層類的構(gòu)造器開始執(zhí)行的,然后依次向下執(zhí)行;
對(duì)于this和super也是一樣;

這個(gè)代碼好好理解一下,就會(huì)對(duì)構(gòu)造器間的關(guān)系體會(huì)更深;

總結(jié)

對(duì)象的初始化離不開構(gòu)造器,對(duì)構(gòu)造器的學(xué)習(xí)真正需要的還是大量的練習(xí),這些內(nèi)容也是需要熟練掌握的;這關(guān)乎著你在實(shí)際開發(fā)應(yīng)用過程中對(duì)整個(gè)代碼的影響和對(duì)象能否恰到好處的初始化;希望你能夠真正學(xué)會(huì)并應(yīng)用到這些方法,且通過這篇文章能有所收獲!

ps:如果內(nèi)容有問題歡迎討論!!

到此這篇關(guān)于Java中你真的會(huì)用Constructor構(gòu)造器嗎之看完本篇你就真的會(huì)了的文章就介紹到這了,更多相關(guān)Java 構(gòu)造器 Constructor內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring boot加入攔截器Interceptor過程解析

    spring boot加入攔截器Interceptor過程解析

    這篇文章主要介紹了spring boot加入攔截器Interceptor過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Spring中的@CrossOrigin注冊(cè)處理方法源碼解析

    Spring中的@CrossOrigin注冊(cè)處理方法源碼解析

    這篇文章主要介紹了Spring中的@CrossOrigin注冊(cè)處理方法源碼解析,@CrossOrigin是基于@RequestMapping,@RequestMapping注釋方法掃描注冊(cè)的起點(diǎn)是equestMappingHandlerMapping.afterPropertiesSet(),需要的朋友可以參考下
    2023-12-12
  • 深入探究TimSort對(duì)歸并排序算法的優(yōu)化及Java實(shí)現(xiàn)

    深入探究TimSort對(duì)歸并排序算法的優(yōu)化及Java實(shí)現(xiàn)

    這篇文章主要介紹了TimSort歸并排序的優(yōu)化及Java實(shí)現(xiàn),TimSort 是一個(gè)歸并排序做了大量?jī)?yōu)化的版本,需要的朋友可以參考下
    2016-05-05
  • Java正則表達(dá)式基礎(chǔ)語(yǔ)法詳解

    Java正則表達(dá)式基礎(chǔ)語(yǔ)法詳解

    這篇文章主要介紹了Java正則表達(dá)式語(yǔ)法,包括常用正則表達(dá)式、匹配驗(yàn)證-驗(yàn)證Email是否正確以及字符串中查詢字符或者字符串,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Spark SQL的自定義函數(shù)UDF使用

    Spark SQL的自定義函數(shù)UDF使用

    Spark Sql可以通過UDF來對(duì)DataFrame的Column進(jìn)行自定義操作。在特定場(chǎng)景下定義UDF可能需要用到Spark Context以外的資源或數(shù)據(jù)。比如從List或Map中取值,或是通過連接池從外部的數(shù)據(jù)源中讀取數(shù)據(jù),然后再參與Column的運(yùn)算
    2023-02-02
  • 利用Java手寫阻塞隊(duì)列的示例代碼

    利用Java手寫阻塞隊(duì)列的示例代碼

    在我們平時(shí)編程的時(shí)候一個(gè)很重要的工具就是容器,在本篇文章當(dāng)中主要給大家介紹阻塞隊(duì)列的原理,并且在了解原理之后自己動(dòng)手實(shí)現(xiàn)一個(gè)低配版的阻塞隊(duì)列,感興趣的可以嘗試一下
    2022-08-08
  • feign調(diào)用中文參數(shù)被encode編譯的問題

    feign調(diào)用中文參數(shù)被encode編譯的問題

    這篇文章主要介紹了feign調(diào)用中文參數(shù)被encode編譯的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • MyBatis使用<foreach>標(biāo)簽報(bào)錯(cuò)問題及解決

    MyBatis使用<foreach>標(biāo)簽報(bào)錯(cuò)問題及解決

    這篇文章主要介紹了MyBatis使用<foreach>標(biāo)簽報(bào)錯(cuò)問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Java隨機(jī)值設(shè)置(java.util.Random類或Math.random方法)

    Java隨機(jī)值設(shè)置(java.util.Random類或Math.random方法)

    在編程中有時(shí)我們需要生成一些隨機(jī)的字符串作為授權(quán)碼、驗(yàn)證碼等,以確保數(shù)據(jù)的安全性和唯一性,這篇文章主要給大家介紹了關(guān)于Java隨機(jī)值設(shè)置的相關(guān)資料,主要用的是java.util.Random類或Math.random()方法,需要的朋友可以參考下
    2024-08-08
  • 淺談標(biāo)簽和JLabel類構(gòu)造方法

    淺談標(biāo)簽和JLabel類構(gòu)造方法

    這篇文章主要介紹了標(biāo)簽和JLabel類構(gòu)造方法,具有一定參考價(jià)值,需要的朋友可以參考下。
    2017-09-09

最新評(píng)論