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

全面理解java中的構造方法以及this關鍵字的用法

 更新時間:2023年03月22日 15:58:51   作者:是小魚兒哈  
本篇文章主要概述了如何用構造方法初始化對象,this屬性名訪問成員變量方法,和this()的用法,感興趣的小伙伴一起來學習吧

初識構造方法 

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

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對象的各個成員變量賦值
        stu1.gender = "男";
        stu1.age = 19;
        stu1.studentID = 231245431;
        // 打印輸出
        System.out.println("姓名:" + stu1.name + " 性別:" + stu1.gender + " 年齡:" + stu1.age + " 學號:" + stu1.studentID);
    }
}

??但你在寫的時候,是不是感覺給對象的成員變量一個一個的賦值太繁瑣,能不能一下子就把值賦好呢?還真能,用Java中的構造方法就能做到這一點。

那么快來看看什么是構造方法吧!

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

Java 構造方法有以下特點:

  • 方法名必須與類名相同
  • 可以有 0 個、1 個或多個參數
  • 沒有任何返回值,包括 void
  • 默認返回類型就是對象類型本身
  • 只能與 new 運算符結合使用

 ??值得注意的是,如果為構造方法定義了返回值類型或使用 void 聲明構造方法沒有返回值,編譯時不會出錯,但 Java 會把這個所謂的構造方法當成普通方法來處理

??下面就是一個構造方法的使用例子

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

看到輸出結果,你是不是感到:咦?不對啊,我的main方法里明明就只是實例化了一個對象啊??!我沒輸出啊,為啥還會輸出構造方法中的內容啊?

Student student1 = new Student();

??原因就是:當類的對象被創(chuàng)建時,該構造方法將被自動調用。

??其實我們在用new關鍵字實例化對象時 , 程序一定干了這兩件事(但可能不只有這兩步)

1.??在堆區(qū)分配對象需要的內存
2.??調用合適的構造方法

??看到這,你可能又有問題了,我們之前實例化對象的時候明明沒定義構造方法呀!怎么能說實例化對象時程序一定調用構造方法呢?

??是這樣的,當一個類中沒有提供任何構造方法,系統(tǒng)默認提供一個無參數的構造方法,就像這樣:

Student() {
}

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

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

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

構造方法的使用 

 那么,就讓我們來看一下,調用構造方法是怎樣解決上面那個麻煩的問題的,嘻嘻??

class Student {
    String name;
    String gender;
    int age;
    long studentID;
    // 該構造方法可由IDEA自動生成
    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 + " 學號:" + stu1.studentID);
    }
}

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

在IDEA里點擊鼠標右鍵,彈出窗口-->在窗口中選擇Generate-->點進去后選擇Constructo-->按住ctrl鍵的同時點擊鼠標,把那幾個參數全選上,點擊OK??

嘻嘻,是不是IDEA幫你自動生成了??,方便吧

初識this 

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

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

class Date {
    int year;
    int month;
    int day;
    // 通過構造函數傳參來賦值
    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();
    }
}

這段代碼有什么問題嗎?細心的同學可能以經發(fā)現了 :在Date類中,傳入構造方法的參數名稱和Date的成員變量名字相同??,那么在Date類中的構造方法中就會出現一個問題:

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

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

讓我們一起來看看吧?

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

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

class Date {
    int year;
    int month;
    int day;
    // 添加了this關鍵字的構造函數
    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關鍵字的意義被解釋為“指向當前對象的引用”,比如在上述代碼中當前所實例化的對象是date1,那么this其實就指向date1,是date1的一個引用(也可以理解為是date1的一個別名)那么this.xxx其實就代表了date1.xxx??

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

??講到這里,有的小伙伴可能會問:”this.year”為什么不能被解釋為”當前對象date1自己的year參數”呢???

??因為”參數”這個概念是就某個方法而言的,它相當于某個方法的”局部變量”,只是這個”局部變量”比起在方法中定義的真正的局部變量來講有點特殊,??它能夠接收從主調方法中傳遞過來的值。因此,當我們說到”參數”這個概念的時候,都是相對于一個”方法”而不是一個”對象”而言的,所以也就不會有”某個對象的參數”這一說法。因此,”this.year”只能被虛擬機認定為當前對象date1自己的year成員變量,絕不會被當作參數。

不知道大家理解??了嗎

??可能現在你還有點模糊,但沒關系,我們現在只是剛接觸到this這個關鍵字,先能模仿著用就行,以后可以慢慢理解??

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

class Cat {
    public void jump() {
        System.out.println("這個貓在跳?。?!");
    }
    public void run() {
        this.jump();        // 在run方法中用this.方法名調用當前對象的一個成員方法jump
        System.out.println("這個貓在跑?。?!");
    }
}
public class TestDemo2 {
    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.run();
    }
}

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

注意??:

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

this()用于構造函數的調用

??咱們之前說了,同一個類中可以同時有多個構造函數,通過this()還可以在一個構造函數里調用另一個構造函數。

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

 從輸出結果可以看出通過??this(),我們成功在一個構造方法中調用另一個不帶參數的構造方法

??但有幾個問題需要我們注意一下 

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

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

很多小伙伴可能不理解,為什么要通過這種方式來調用構造方法呢?我們在上面調用Cat類中一個不帶參數的構造方法時,難道不能直接寫一個??Cat();來調用嗎?

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

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

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

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

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

相關文章

  • Java中Iterator(迭代器)的用法詳解

    Java中Iterator(迭代器)的用法詳解

    Java迭代器(Iterator)是?Java?集合框架中的一種機制,它提供了一種在不暴露集合內部實現的情況下遍歷集合元素的方法。本文主要介紹了它的使用方法,希望對大家有所幫助
    2023-05-05
  • java實現折半排序算法

    java實現折半排序算法

    折半插入排序法,又稱二分插入排序法,是直接插入排序法的改良版,也需要執(zhí)行i-1趟插入,不同之處在于,第i趟插入,先找出第i+1個元素應該插入的的位置,假定前i個數據是已經處于有序狀態(tài)。
    2015-04-04
  • 如何基于JWT實現接口的授權訪問詳解

    如何基于JWT實現接口的授權訪問詳解

    授權是最常見的JWT使用場景,下面這篇文章主要給大家介紹了關于如何基于JWT實現接口的授權訪問的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-02-02
  • java 獲取當前路徑下的所有xml文檔的方法

    java 獲取當前路徑下的所有xml文檔的方法

    這篇文章主要介紹了java如何獲取當前路徑下的所有xml文檔,需要的朋友可以參考下
    2014-05-05
  • MySQL數據庫之Purge死鎖問題解析

    MySQL數據庫之Purge死鎖問題解析

    這篇文章主要介紹了MySQL數據庫之Purge死鎖問題解析的相關資料,需要的朋友可以參考下
    2017-11-11
  • 如何在Spring中自定義scope的方法示例

    如何在Spring中自定義scope的方法示例

    這篇文章主要介紹了如何在Spring中自定義scope的方法示例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • 關于ireport中傳入list的處理方式

    關于ireport中傳入list的處理方式

    這篇文章主要介紹了關于ireport中傳入list的處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 詳細解讀AbstractStringBuilder類源碼

    詳細解讀AbstractStringBuilder類源碼

    這篇文章主要介紹了詳細解讀AbstractStringBuilder類源碼,具有一定參考價值,需要的朋友可以了解下。
    2017-12-12
  • java中ExecutorService創(chuàng)建方法總結

    java中ExecutorService創(chuàng)建方法總結

    在本篇文章里小編給大家整理了一篇關于java中ExecutorService創(chuàng)建方法總結,有興趣的朋友們可以參考下。
    2021-01-01
  • JavaWeb利用郵箱幫用戶找回密碼

    JavaWeb利用郵箱幫用戶找回密碼

    這篇文章主要為大家詳細介紹了JavaWeb利用郵箱幫用戶找回密碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02

最新評論