1、什么是構造器?
在Java中,函式通常被稱為方法(只是一種叫法,按個人習慣來);而所謂的構造器,也就是一種特殊的方法(不要被構造器這么高大上的名字嚇到了),
2、構造方法的具體用處與使用
引入:
new物件的程序,實際上是呼叫的類中的默認的構造方法;這時你可能就有疑問了,如果是呼叫的方法,那創建一個類的時候并沒有去創建一個所謂的構造方法啊?怎么就能直接呼叫了呢?比如下面一段代碼
public class Student {
private String username;
private String password;
// 省略了setter getter方法
}
這段程式出了兩個欄位,什么也沒有,但是當你需要操作這些欄位的時候,只需要直接new Student() 即可創建出來一個Student物件,然后打點呼叫setter方法進行操作私有變數即可,此處你之所以能成功創建一個物件,得益于編譯器給你創建了個默認的構造方法;
當然你可以手動去創建一個構造方法:
public class Student {
private String username;
private String password;
// 構造方法
public Student(){
}
}
- 構造方法的創建規則
規定:構造方法的方法名必須和類名相同(這種命名方式是為了讓編譯器更容易辨別哪個是構造方法,如果給構造方法起別的名字,難免會和某個欄位或方法重名;在初始化期間要自動呼叫構造方法,所以使用和類名相同的名稱,是一種非常不錯的選擇),且不帶回傳值(這里的意思不是回傳值型別為void),即 權限修飾符+類名(){}
權限修飾符可以為任意的修飾符,但是默認的為public,如果修飾符改為private,則物件不能在外部被創建(這里不考慮反射),
當然構造方法也可以和普通方法一樣,擁有引數串列,如下:
public class Student {
private String username;
private String password;
public Student(String username,String password){
this.username = username;
this.password = password;
}
// 省略setter getter方法
}
this 關鍵字是為了區分形參和欄位的,我把它記為就遠原則,即this打點的變數離哪個遠,指的就是哪個變數
此時,構造方法就有了引數,接下來測驗一下這個構造方法
public class StudentTest {
public static void main(String[] args) {
Student student = new Student("user","123");
System.out.println("username:" + student.getUsername());
System.out.println("password:" + student.getPassword());
}
}
運行結果如下:

此時在創建物件的時候,引數 user 和 123 通過構造方法賦值給了欄位,
當然,這時如果在執行以下寫出以下代碼,就會出錯
Student stu = new Student();
因為當你自己創建時,編譯器會當圍觀群眾:"喲呵,大家快來看啊,這貨自己寫構造方法了,終于讓我放松一下了,每次都提供默認的,快把我給累趴了";
這時如果你習慣了編譯器提供的默認構造方法的話,你可以會直接去寫上邊的代碼;
此時你的編譯環境也不樂意了:"連個無參(默認)構造方法都沒有,你寫的是什么啊?你不給我無參構造方法,還想通過我這關去拿記憶體?做夢去吧";
而你則一臉懵的看著那刺眼的紅色波浪線發愁:"以前都沒事,咋這次不行了呢?"
所以為了避免被鄙視,我們需要自己把無參(默認)構造方法給寫出來才行;
不是說一個方法名在一個類中只能出現一次嗎?咋還寫兩個了呢?那不更被鄙視嗎?
- 方法多載
為了方便我們,寫jdk的大牛們,發明了方法多載;
怎么區分多載方法呢?
這就像雙胞胎一樣,看似長得一樣,卻也有自己獨一無二的地方;即使長得再想,媽媽們總有辦法一眼認出,而編譯器就像媽媽一樣,能慧眼識真偽,
方法多載的規則:
每個多載的方法都必須要有一個獨一無二的引數串列,方法名必須相同,就像雙胞胎一樣,但是引數串列不同,就像雙胞胎的不同之處,
對于一個方法來說,可能沒有更好的方法去區分同名的方法了吧,"嗯哼?" "你確定嗎?" "當然確定啊"
那引數的順序不能區分嗎?
當然可以啊,但是如果這么設計,恐怕那些大牛們會被鄙視吧,
Java的基本型別,能把一個"較小"的資料型別自動提升為一個"較大"的型別(當然其他語言也可能會自動轉換),如果引數串列為基本型別,傳入的資料又十分的極端,那編譯器估計會瘋掉,
那....那用回傳值來區分總沒問題了吧?
嗯....好像是可以,但是你有沒有想過一件事,如果不需要這個方法的回傳值呢?只是需要某個方法的某些功能,比如列印陳述句(舉個栗子),只是簡單的去呼叫一下,并沒有去接識訓傳值,那編譯器又不知道呼叫的是哪個方法了
比如下面的栗子:
public class Test{
void m1(){}
int m1(){
return 0;
}
public static void main(String[] args){
Test t = new Test();
t.m1();
}
}
// 注意此代碼會報錯 這里只是栗子
這時候,恐怕是你都不知道要呼叫的是誰了吧;就比如你叫雙胞胎:"嘿,長得帥的寶貝,來我這里領糖吃了";他倆可能會因為誰長的帥而打起來吧,
因為構造方法也是方法,他同樣可以被多載,所以這樣寫就理所當然了啊,
總結:
構造方法在類中的地位就等于一人之上萬人之下吧(哈哈,腦補出了畫面),本篇為看過編程思想后的一些小理解,簡單記錄一下(由于剛開始寫博客,可能寫的有點亂),同時分享一下,如有錯誤,歡迎指出,一定及時改正!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/183447.html
標籤:其他
上一篇:java基礎打卡
