最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中構(gòu)造方法及this關(guān)鍵字的用法實(shí)例詳解(超詳細(xì))

 更新時(shí)間:2022年04月24日 10:02:31   作者:是小魚兒哈  
大家都知道,java作為一門內(nèi)容豐富的編程語(yǔ)言,其中涉及的范圍是十分廣闊的,下面這篇文章主要給大家介紹了關(guān)于java中構(gòu)造方法及this關(guān)鍵字用法的相關(guān)資料,需要的朋友可以參考下

初識(shí)構(gòu)造方法 

我們上篇講了java中類的創(chuàng)建,那么讓我們來實(shí)戰(zhàn)演練一下:創(chuàng)建一個(gè)學(xué)生類,里面有學(xué)生的基本信息,包括姓名、性別、年齡、學(xué)號(hào),你可能會(huì)寫出這樣的代碼:

class Student {
    String name;
    String gender;
    int age;
    long studentID;
}
public class TestDemo2 {
    public static void main(String[] args) {
        Student stu1 = new Student();
        stu1.name = "張三";                  // 給stu1對(duì)象的各個(gè)成員變量賦值
        stu1.gender = "男";
        stu1.age = 19;
        stu1.studentID = 231245431;
        // 打印輸出
        System.out.println("姓名:" + stu1.name + " 性別:" + stu1.gender + " 年齡:" + stu1.age + " 學(xué)號(hào):" + stu1.studentID);
    }
}

 ??但你在寫的時(shí)候,是不是感覺給對(duì)象的成員變量一個(gè)一個(gè)的賦值太繁瑣,能不能一下子就把值賦好呢?還真能,用Java中的構(gòu)造方法就能做到這一點(diǎn)。

那么快來看看什么是構(gòu)造方法吧!

??構(gòu)造方法是類的一種特殊方法,用來初始化類的一個(gè)新的對(duì)象,在創(chuàng)建對(duì)象(new 運(yùn)算符)之后自動(dòng)調(diào)用,Java中的每個(gè)類都有一個(gè)默認(rèn)的構(gòu)造方法,并且可以有一個(gè)以上的構(gòu)造方法。

Java 構(gòu)造方法有以下特點(diǎn):

  • 方法名必須與類名相同
  • 可以有 0 個(gè)、1 個(gè)或多個(gè)參數(shù)
  • 沒有任何返回值,包括 void
  • 默認(rèn)返回類型就是對(duì)象類型本身
  • 只能與 new 運(yùn)算符結(jié)合使用

??值得注意的是,如果為構(gòu)造方法定義了返回值類型或使用 void 聲明構(gòu)造方法沒有返回值,編譯時(shí)不會(huì)出錯(cuò),但 Java 會(huì)把這個(gè)所謂的構(gòu)造方法當(dāng)成普通方法來處理

??下面就是一個(gè)構(gòu)造方法的使用例子

class Student {
    String name;   //學(xué)生類的屬性
    int age;
    public void eat() {
        System.out.println(name + "在吃飯");   // 學(xué)生類的行為(方法)
    }
    public Student() {
        System.out.println("這是自定義的一個(gè)不帶參數(shù)的構(gòu)造方法");
    }
}
public class TestDemo3 {
    public static void main(String[] args) {
        Student student1 = new Student();
    }
}

看到輸出結(jié)果,你是不是感到:咦?不對(duì)啊,我的main方法里明明就只是實(shí)例化了一個(gè)對(duì)象啊??!我沒輸出啊,為啥還會(huì)輸出構(gòu)造方法中的內(nèi)容???

  Student student1 = new Student();

??原因就是:當(dāng)類的對(duì)象被創(chuàng)建時(shí),該構(gòu)造方法將被自動(dòng)調(diào)用。

??其實(shí)我們?cè)谟胣ew關(guān)鍵字實(shí)例化對(duì)象時(shí) , 程序一定干了這兩件事(但可能不只有這兩步)

  1. ??在堆區(qū)分配對(duì)象需要的內(nèi)存
  2. ??調(diào)用合適的構(gòu)造方法

??看到這,你可能又有問題了,我們之前實(shí)例化對(duì)象的時(shí)候明明沒定義構(gòu)造方法呀!怎么能說實(shí)例化對(duì)象時(shí)程序一定調(diào)用構(gòu)造方法呢?

??是這樣的,當(dāng)一個(gè)類中沒有提供任何構(gòu)造方法,系統(tǒng)默認(rèn)提供一個(gè)無參數(shù)的構(gòu)造方法,就像這樣

Student() {}

?? 但如果類中顯式地定義了一個(gè)或多個(gè)構(gòu)造方法,則系統(tǒng)不再提供默認(rèn)構(gòu)造方法。

在一個(gè)類中,與類名相同的方法就是構(gòu)造方法。每個(gè)類可以具有多個(gè)構(gòu)造方法,但要求它們各自包含不同的方法參數(shù),比如這樣:

Student() {
    System.out.println("這是自定義的一個(gè)沒有參數(shù)的構(gòu)造方法");
}
Student(String name) {
    this.name = name;
    System.out.println("這是自定義的帶有一個(gè)參數(shù)的構(gòu)造方法");
}
  • ?? 該示例就定義了兩個(gè)構(gòu)造方法,分別是無參構(gòu)造方法和有參構(gòu)造方法。
  • ??如果在一個(gè)類中定義多個(gè)具有不同參數(shù)的同名方法,稱作方法的重載。
  • ??這兩個(gè)構(gòu)造方法的名稱都與類名相同,均為Student。在實(shí)例化該類時(shí)可以調(diào)用不同的構(gòu)造方法進(jìn)行初始化。

構(gòu)造方法的使用 

 那么,就讓我們來看一下,調(diào)用構(gòu)造方法是怎樣解決上面那個(gè)麻煩的問題的,嘻嘻??

class Student {
    String name;
    String gender;
    int age;
    long studentID;
    // 該構(gòu)造方法可由IDEA自動(dòng)生成
    public Student(String name, String gender, int age, long studentID) {  
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.studentID = studentID;
    }
}
public class TestDemo2 {
    public static void main(String[] args) {
        Student stu1 = new Student("張三", "男", 19, 231245431);
        System.out.println("姓名:" + stu1.name + " 性別:" + stu1.gender + " 年齡:" + stu1.age + " 學(xué)號(hào):" + stu1.studentID);
    }
}

 ??怎么樣,是不是一下子就把值賦好,哈哈??,并且類中的構(gòu)造方法的定義還不用自己寫,在IDEA有相應(yīng)的快捷鍵可以自動(dòng)生成,就像這樣:

在IDEA里點(diǎn)擊鼠標(biāo)右鍵,彈出窗口-->在窗口中選擇Generate-->點(diǎn)進(jìn)去后選擇Constructo-->按住ctrl鍵的同時(shí)點(diǎn)擊鼠標(biāo),把那幾個(gè)參數(shù)全選上,點(diǎn)擊OK??

嘻嘻,是不是IDEA幫你自動(dòng)生成了??,方便吧

初識(shí)this 

 不過,構(gòu)造方法中的this.name是什么意思啊,以前不都是 "對(duì)象名.成員變量" 嗎,來接下來,我們慢慢說這個(gè)this到底是什么東東??

首先,咱先來看一段代碼??

class Date {
    int year;
    int month;
    int day;
    // 通過構(gòu)造函數(shù)傳參來賦值
    public Date(int year, int month, int day) {
        year = year;
        month = month;
        day = day;
    }
 
    public void printDate() {
        System.out.println(year + "/" + month + "/" + day);
    }
}
 
public class TestDemo2 {
    public static void main(String[] args) {
        Date date1 = new Date(2022, 4, 2);
        date1.printDate();
    }
}

這段代碼有什么問題嗎?細(xì)心的同學(xué)可能以經(jīng)發(fā)現(xiàn)了 :在Date類中,傳入構(gòu)造方法的參數(shù)名稱和Date的成員變量名字相同??,那么在Date類中的構(gòu)造方法中就會(huì)出現(xiàn)一個(gè)問題:

public Date(int year, int month, int day) {
        // 那函數(shù)體中到底是誰給誰賦值?成員變量給成員變量?參數(shù)給參數(shù)?參數(shù)給成員變量?
        // 成員變量給參數(shù)?估計(jì)自己都搞不清楚了
        year = year;            // 當(dāng)傳入的參數(shù)相同是怎么辦!
        month = month;
        day = day;
}

大家覺得在上面的main方法中會(huì)輸出什么?是2022/4/2嗎??? 

讓我們一起來看看吧?

??輸出竟然是0/0/0,好像我們根本沒給year,month,day賦值似的? 

其實(shí)當(dāng)構(gòu)造方法的參數(shù)與類所定義的屬性同名時(shí),對(duì)于方法中的year = year,虛擬機(jī)不清楚在這里year到底是傳過來的參數(shù)還是對(duì)象的成員變量,那么為了讓虛擬機(jī)知道我們是把參數(shù)2022賦值給當(dāng)前對(duì)象的成員變量year,我們就需要借助java中this這個(gè)關(guān)鍵字:

class Date {
    int year;
    int month;
    int day;
    // 添加了this關(guān)鍵字的構(gòu)造函數(shù)
    public Date(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }
 
    public void printDate() {
        System.out.println(year + "/" + month + "/" + day);
    }
}
 
public class TestDemo2 {
    public static void main(String[] args) {
        Date date1 = new Date(2022, 4, 2);
        date1.printDate();
    }
}

 ??那為什么用this.name = name 賦值就好了呢?

this.xx的用法

??按照官方正規(guī)的解釋,this關(guān)鍵字的意義被解釋為“指向當(dāng)前對(duì)象的引用”,比如在上述代碼中當(dāng)前所實(shí)例化的對(duì)象是date1,那么this其實(shí)就指向date1,是date1的一個(gè)引用(也可以理解為是date1的一個(gè)別名)那么this.xxx其實(shí)就代表了date1.xxx??

??所以在執(zhí)行”this.name=name;”這條語(yǔ)句的時(shí)候,虛擬機(jī)就會(huì)把參數(shù)year的值”2022”賦值給對(duì)象date1的year成員變量。也就是說在這條賦值語(yǔ)句中,”=”左邊的”this.year”表示對(duì)象date1的year成員變量,而”=”右邊的year表示傳給我們構(gòu)造方法的參數(shù)。

??講到這里,有的小伙伴可能會(huì)問:”this.year”為什么不能被解釋為”當(dāng)前對(duì)象date1自己的year參數(shù)”呢???

??因?yàn)?rdquo;參數(shù)”這個(gè)概念是就某個(gè)方法而言的,它相當(dāng)于某個(gè)方法的”局部變量”,只是這個(gè)”局部變量”比起在方法中定義的真正的局部變量來講有點(diǎn)特殊,??它能夠接收從主調(diào)方法中傳遞過來的值。因此,當(dāng)我們說到”參數(shù)”這個(gè)概念的時(shí)候,都是相對(duì)于一個(gè)”方法”而不是一個(gè)”對(duì)象”而言的,所以也就不會(huì)有”某個(gè)對(duì)象的參數(shù)”這一說法。因此,”this.year”只能被虛擬機(jī)認(rèn)定為當(dāng)前對(duì)象date1自己的year成員變量,絕不會(huì)被當(dāng)作參數(shù)。

不知道大家理解??了嗎

 ??可能現(xiàn)在你還有點(diǎn)模糊,但沒關(guān)系,我們現(xiàn)在只是剛接觸到this這個(gè)關(guān)鍵字,先能模仿著用就行,以后可以慢慢理解??

??剛才我們用this.成員變量名訪問了我們當(dāng)前對(duì)象的成員變量,那么我們能不能用this.成員方法名去訪問我們的方法呢?當(dāng)然可以呀this.xxx此時(shí)的作用不就相當(dāng)于對(duì)象名.xxx嗎??,直接上代碼??

class Cat {
    public void jump() {
        System.out.println("這個(gè)貓?jiān)谔。。?);
    }
    public void run() {
        this.jump();        // 在run方法中用this.方法名調(diào)用當(dāng)前對(duì)象的一個(gè)成員方法jump
        System.out.println("這個(gè)貓?jiān)谂埽。。?);
    }
}
public class TestDemo2 {
    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.run();
    }
}

?? 可以看出在我們成功的在run方法中用this.方法名調(diào)用了同一個(gè)類下的其他方法。

注意??:

雖然調(diào)用本類的普通方法前可以不使用this關(guān)鍵詞。但是建議追加是this,這樣的目的是可以區(qū)分方法的定義來源??

this()用于構(gòu)造函數(shù)的調(diào)用

??咱們之前說了,同一個(gè)類中可以同時(shí)有多個(gè)構(gòu)造函數(shù),通過this()還可以在一個(gè)構(gòu)造函數(shù)里調(diào)用另一個(gè)構(gòu)造函數(shù)。

class Cat {
    String name;
    int age;
    Cat() {
        System.out.println("這是自定義的一個(gè)不帶參數(shù)的構(gòu)造函數(shù)");
    }
 
    public Cat(String name, int age) {
        this();            // 調(diào)用另一個(gè)不帶參數(shù)的構(gòu)造方法
        
        this.name = name;
        this.age = age;
        System.out.println(this.name + this.age + "歲了");
        System.out.println("這是自定義的一個(gè)帶兩個(gè)參數(shù)的構(gòu)造函數(shù)");
    }
}
public class TestDemo2 {
    public static void main(String[] args) {
        Cat cat = new Cat("小花", 3);
    }
}

 從輸出結(jié)果可以看出通過??this(),我們成功在一個(gè)構(gòu)造方法中調(diào)用另一個(gè)不帶參數(shù)的構(gòu)造方法

??但有幾個(gè)問題需要我們注意一下 

  • this( ) 不能在普通方法中使用,只能寫在構(gòu)造方法中。
  • 在構(gòu)造方法中使用時(shí),必須是第一條語(yǔ)句。

另外,再補(bǔ)充一些小細(xì)節(jié)?? 

很多小伙伴可能不理解,為什么要通過這種方式來調(diào)用構(gòu)造方法呢?我們?cè)谏厦嬲{(diào)用Cat類中一個(gè)不帶參數(shù)的構(gòu)造方法時(shí),難道不能直接寫一個(gè)??Cat();來調(diào)用嗎?

????????????????????????????????

??這里必須做出解釋:在Java語(yǔ)言中,一個(gè)類的構(gòu)造方法與類名相同。但是,一個(gè)類當(dāng)中也可以定義一個(gè)與類名相同的”普通方法”,??換句話說就是:并不是只有構(gòu)造方法與類名相同,”普通方法”也可以取和類相同的名稱(只不過全世界的程序員都不會(huì)這么干)。

 

??那么,在這種情況下,編譯器如何區(qū)分這個(gè)方法是”普通方法”還是”構(gòu)造方法”呢???很簡(jiǎn)單,”普通方法”的名稱前面必須定義返回值類型,而”構(gòu)造方法”的名稱前面則沒有返回值類型的定義。這樣,編譯器就能夠分得清哪個(gè)是”構(gòu)造方法”,哪個(gè)是”和類同名的普通方法”。

 

??定義的時(shí)候分得清,但是在調(diào)用的時(shí)候,都是通過方法名來調(diào)用的??,這時(shí)如何分得清代碼中哪一句調(diào)用的是”構(gòu)造方法”, 哪一句調(diào)用的是”和類同名的普通方法”呢?為了解決這個(gè)問題,Java語(yǔ)言規(guī)定,在本類中調(diào)用構(gòu)造方法的時(shí)候,需要通過”??this(參數(shù))”的方式來調(diào)用。

總結(jié)

到此這篇關(guān)于java中構(gòu)造方法及this關(guān)鍵字用法的文章就介紹到這了,更多相關(guān)java構(gòu)造方法this關(guān)鍵字的用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Java中native關(guān)鍵字

    詳解Java中native關(guān)鍵字

    這篇文章主要為大家詳細(xì)介紹了Java中native關(guān)鍵字,什么是Native Method
    2016-02-02
  • 圖文淺析Java序列化和反序列化

    圖文淺析Java序列化和反序列化

    序列化(Serialization)是將對(duì)象的狀態(tài)信息轉(zhuǎn)化為可以存儲(chǔ)或者傳輸?shù)男问降倪^程,下面這篇文章主要給大家介紹了關(guān)于Java序列化和反序列化的相關(guān)資料,需要的朋友可以參考下
    2021-05-05
  • 詳解elasticsearch之metric聚合實(shí)現(xiàn)示例

    詳解elasticsearch之metric聚合實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了elasticsearch之metric聚合實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Java實(shí)現(xiàn)簡(jiǎn)單汽車租賃系統(tǒng)

    Java實(shí)現(xiàn)簡(jiǎn)單汽車租賃系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單汽車租賃系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • spring boot配置druid連接池的完整步驟

    spring boot配置druid連接池的完整步驟

    這篇文章主要給大家介紹了關(guān)于spring boot配置druid連接池的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • Java上傳文件到服務(wù)器指定文件夾實(shí)現(xiàn)過程圖解

    Java上傳文件到服務(wù)器指定文件夾實(shí)現(xiàn)過程圖解

    這篇文章主要介紹了Java上傳文件到服務(wù)器指定文件夾實(shí)現(xiàn)過程圖解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • java 中String.equals和==的比較

    java 中String.equals和==的比較

    這篇文章主要介紹了java 中String.equals和==的比較的相關(guān)資料,需要的朋友可以參考下
    2017-08-08
  • Spring動(dòng)態(tài)加載bean后調(diào)用實(shí)現(xiàn)方法解析

    Spring動(dòng)態(tài)加載bean后調(diào)用實(shí)現(xiàn)方法解析

    這篇文章主要介紹了Spring動(dòng)態(tài)加載bean后調(diào)用實(shí)現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Java中使用Spring Retry實(shí)現(xiàn)重試機(jī)制的流程步驟

    Java中使用Spring Retry實(shí)現(xiàn)重試機(jī)制的流程步驟

    這篇文章主要介紹了我們將探討如何在Java中使用Spring Retry來實(shí)現(xiàn)重試機(jī)制,重試機(jī)制在處理臨時(shí)性故障和提高系統(tǒng)穩(wěn)定性方面非常有用,文中通過代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-07-07
  • 關(guān)于TreeMap自定義排序規(guī)則的兩種方式

    關(guān)于TreeMap自定義排序規(guī)則的兩種方式

    這篇文章主要介紹了關(guān)于TreeMap自定義排序規(guī)則的兩種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08

最新評(píng)論

南京市| 海口市| 绥棱县| 梓潼县| 玉门市| 商丘市| 神池县| 许昌县| 社旗县| 丹寨县| 句容市| 绵竹市| 丰都县| 曲水县| 南充市| 祁连县| 绿春县| 伊金霍洛旗| 德化县| 佛山市| 长岭县| 宁武县| 洛浦县| 博白县| 柘城县| 乐陵市| 彭泽县| 海门市| 芒康县| 来安县| 锡林浩特市| 浙江省| 合作市| 祁东县| 比如县| 股票| 施秉县| 虞城县| 泰州市| 通海县| 大同县|