Java中的構(gòu)造方法和方法重載完整代碼
一、構(gòu)造方法
1.從方法到構(gòu)造方法
今天我們來講講什么是構(gòu)造方法,不同于千篇一律一上來就給出定義(形如...的是構(gòu)造方法),先進行一些回顧,從我們更為熟悉的“方法”下手。
那么,什么是方法?
這應(yīng)該是學習Java第一節(jié)課入門時就已經(jīng)了解了的一個名詞。方法是一種函數(shù),也是一個代碼片段,用于執(zhí)行特定的任務(wù)或操作,或者可以說是一段封裝了特定功能或任務(wù)的可重用代碼塊。
方法有哪些種類呢?
除了我們經(jīng)常接觸的實例方法(也稱成員方法),比較陌生的靜態(tài)方法,還有就是我們今天要講的構(gòu)造方法了。抽象方法目前用到的比較少,暫且不做提及。
其實,構(gòu)造方法與實例方法大有不同,下面我們就來看看到底什么是構(gòu)造方法。
2.什么是構(gòu)造方法
1)構(gòu)造方法的定義
長成如下這種樣子的我們就叫做構(gòu)造方法:
→ 無返回值(含void)、方法名與類名相同,在創(chuàng)建對象時由編譯器自動調(diào)用
public class( ){ }
在每個類中都自帶構(gòu)造方法,但該構(gòu)造方法無參數(shù)及方法內(nèi)容。我們也可以自己在類中創(chuàng)建構(gòu)造方法。每個類都有至少一個構(gòu)造方法,如果沒有明確定義,Java會提供一個默認的無參構(gòu)造方法。
證明如下:創(chuàng)建一個名為空的類和一個主函數(shù)后,在out里我們尋找相對應(yīng)的文件名打開。
會得到如下的結(jié)果
2)構(gòu)造方法的作用
構(gòu)造方法是一種特殊的方法,它的作用是在創(chuàng)建對象時初始化對象的狀態(tài)。
通過構(gòu)造方法,我們可以在創(chuàng)建對象時為對象的屬性賦初值。
使用構(gòu)造方法時可以將賦值的代碼寫好,在之后主函數(shù)入口創(chuàng)建對象時就不需要使用對象變量名一個一個賦值了,可以直接按照在構(gòu)造方法中“打包”的格式在主函數(shù)中直接創(chuàng)建對象后傳入值(可以在下面的代碼實例中具體理解)。
——總結(jié)一下就是構(gòu)造方法通常用于初始化和代碼復(fù)用。
3.構(gòu)造方法的代碼實例
1) 系統(tǒng)默認的無參構(gòu)造方法
雖然代碼中沒有明確定義構(gòu)造方法,但默認構(gòu)造方法確實存在并被調(diào)用。
在主函數(shù)中Data實例化對象時,會調(diào)用默認構(gòu)造方法來初始化對象。
public class Data { private int age; private String name; private boolean gender; public void printInfo(){ System.out.println("age"+age+"name"+name+"gender"+gender); } public static void main(String[] args){ Data data = new Data(); data.printInfo(); } }
輸出結(jié)果:0+null+false
2) 在1.0的基礎(chǔ)上為成員屬性進行賦值
public class Data { private int age=1; private String name="abc"; private boolean gender=true; public void printInfo(){ System.out.println("age:————"+age+" name:————"+name+" gender:————"+gender); } public static void main(String[] args){ Data data = new Data(); data.printInfo(); } }
輸出結(jié)果:age:————1 name:————abc gender:————true
3) 定義一個帶有參數(shù)的構(gòu)造方法
在主方法中,實例化Data對象時調(diào)用了新定義的帶參數(shù)的構(gòu)造方法,傳入具體的參數(shù)值來初始化對象。
public class Data { private int age; private String name; private boolean gender; public Data(int age,String name,boolean gender){ this.age=age; this.name=name; this.gender=gender; System.out.println("調(diào)用一次構(gòu)造方法"); } public void printInfo(){ System.out.println("age:————"+age+" name:————"+name+" gender:————"+gender); } public static void main(String[] args){ Data data = new Data(1,"abc",true); data.printInfo(); } }
輸出結(jié)果:age:————1 name:————abc gender:————true
看到這里,我們不妨思考一下,從1.0過渡到3.0中,究竟有哪些差異,或者說是我們定義的構(gòu)造函數(shù)體現(xiàn)了什么樣的作用。
1.0是我提供的一個最基本的代碼,2.0在此基礎(chǔ)上對私有變量進行了賦值,3.0雖然與2.0是同樣的輸出結(jié)果,但多出了一塊構(gòu)造方法,以及在創(chuàng)建(實例化)對象時也是略有差異。
4.分析代碼與總結(jié)
1)this關(guān)鍵字的一些作用
作用 | 區(qū)分局部變量和實例變量 | 當方法的參數(shù)或局部變量與實例變量同名時,使用 this 可以明確指示要操作的是實例變量。 |
在構(gòu)造方法中調(diào)用其他構(gòu)造方法 | 在構(gòu)造方法中使用 this(...) 可以調(diào)用同一個類中的其他構(gòu)造方法。這樣可以避免重復(fù)代碼,并實現(xiàn)代碼的復(fù)用。 例如,this(year, month, day) 可以在構(gòu)造方法中調(diào)用另一個構(gòu)造方法來初始化對象。 |
this.實例變量=構(gòu)造方法中的參數(shù)值;
參數(shù)變量可以接收外部傳入的數(shù)值,將值賦給當前類的實例變量,從而初始化對象的狀態(tài)。
2)構(gòu)造方法和一般方法的區(qū)別
從上述給出的代碼不難看出,一般方法都需要我們在主函數(shù)中先創(chuàng)建對象然后利用對象調(diào)用方法,構(gòu)造方法則不需要我們調(diào)用由Java編譯器自動調(diào)用。
二、方法重載
1.什么是方法重載?
定義:方法重載機制允許一個類中存在多個重名方法,但必須要求參數(shù)數(shù)量、(當數(shù)量一致)參數(shù)類型、(當數(shù)量類型一致)順序不一致。
參數(shù)數(shù)量→ | 參數(shù)數(shù)量 | 參數(shù)數(shù)量 |
參數(shù)類型→ | 參數(shù)類型 | |
→參數(shù)順序 |
在上述JButton中我們可以選擇在按鈕上放字符串或者是圖標Image就體現(xiàn)了方法重載機制。
從方法重載不難推出構(gòu)造方法也可以重載,從而一個類可以定義多個構(gòu)造方法。
2.方法重載的代碼實例
public class Car { private String brand; private String model; private int year; // 無參構(gòu)造方法 public Car() { this.brand = "Unknown"; this.model = "Unknown"; this.year = 0; } // 帶參數(shù)的構(gòu)造方法 public Car(String brand, String model, int year) { this.brand = brand; this.model = model; this.year = year; } public void displayInfo() { System.out.println("Car brand: " + brand); System.out.println("Car model: " + model); System.out.println("Car year: " + year); } public static void main(String[] args) { Car car1 = new Car(); // 調(diào)用無參構(gòu)造方法 car1.displayInfo(); Car car2 = new Car("Toyota", "Camry", 2022); // 調(diào)用帶參數(shù)的構(gòu)造方法 car2.displayInfo(); } }
三、整體代碼(構(gòu)造方法+方法重載)
import java.util.concurrent.ThreadLocalRandom; public class Data { private int age; private String name; private boolean gender; private long ID; public Data(){ this(10,"111",true); } /** * true:男 * false:女 */ public Data(int age,String name,boolean gender){ this.age=age; this.name=name; this.gender=gender; System.out.println("---------------------------"); randomID();//可以不需要在主函數(shù)處調(diào)用兩次 printInfo(); //System.out.println("調(diào)用一次構(gòu)造方法"); System.out.println("---------------------------"); } public void printInfo(){ System.out.println("age:"+age+"\nname:"+name+"\ngender:"+gender); } public void randomID(){ ID= ThreadLocalRandom.current().nextLong(); System.out.println("ID:"+ID); } public static void main(String[] args){ Data data1 = new Data(1,"abc",true);//分別會輸出一次“調(diào)用一次xxxx” Data data2 = new Data(2,"www",false); //Data data = new Data(); } }
從代碼運行結(jié)果不難看出兩個data對象分別調(diào)用了一次構(gòu)造方法,總計兩次。
略有不同的是,我將所有方法的初始化都放在了構(gòu)造方法中(在構(gòu)造方法中調(diào)用了實例方法),所以主函數(shù)入口中看起來略顯單薄,這樣優(yōu)點確實代碼更加簡便一點,但同時也包含一些隱藏的缺點(如對象未完全初始化完成的情況下就提前輸出信息等等)。
總結(jié)
到此這篇關(guān)于Java中的構(gòu)造方法和方法重載的文章就介紹到這了,更多相關(guān)Java構(gòu)造方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用MappingJackson2XmlView實現(xiàn)JSON到XML的視圖轉(zhuǎn)換
MappingJackson2XmlView來實現(xiàn)從JSON到XML格式的響應(yīng)轉(zhuǎn)換,本文將通過案例,將展示如何將JSON格式的數(shù)據(jù)轉(zhuǎn)換為XML格式,以滿足不同客戶端的數(shù)據(jù)交換需求,需要的朋友可以參考下2024-07-07Java異常java.lang.UnsatisfiedLinkError: no opencv_ja
這篇文章主要介紹了Java異常java.lang.UnsatisfiedLinkError: no opencv_java320 in java.library.path的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12Java中Dijkstra算法求解最短路徑的實現(xiàn)
Dijkstra算法是一種解決最短路徑問題的常用算法,本文主要介紹了Java中Dijkstra算法求解最短路徑的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2023-09-09Spring aop 如何通過獲取代理對象實現(xiàn)事務(wù)切換
這篇文章主要介紹了Spring aop 如何通過獲取代理對象實現(xiàn)事務(wù)切換的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07Java使用黑盒方式模擬實現(xiàn)內(nèi)網(wǎng)穿透
這篇文章主要介紹了Java使用黑盒方式模擬實現(xiàn)內(nèi)網(wǎng)穿透,內(nèi)網(wǎng)穿透,也即 NAT 穿透,進行 NAT 穿透是為了使具有某一個特定源 IP 地址和源端口號的數(shù)據(jù)包不被 NAT 設(shè)備屏蔽而正確路由到內(nèi)網(wǎng)主機,需要的朋友可以參考下2023-05-05