构造器是什么?(Java篇)
構(gòu)造方法的定義:
構(gòu)造方法也叫構(gòu)造器或者構(gòu)造函數(shù)
構(gòu)造方法與類名相同,沒有返回值,連void都不能寫
構(gòu)造方法可以重載(重載:方法名稱相同,參數(shù)列表不同)
如果一個類中沒有構(gòu)造方法,那么編譯器會為類加上一個默認(rèn)的構(gòu)造方法。
默認(rèn)構(gòu)造方法格式如下:
public 類名() {
}
如果手動添加了構(gòu)造器,那么默認(rèn)構(gòu)造器就會消失。
建議代碼中將無參構(gòu)造器寫出來。
public class Student {public String name;public int age;public void eat() {System.out.println("eat....");}//構(gòu)造器/*** 名稱與類名相同,沒有返回值,不能寫void* 構(gòu)造器可以重載* 如果類中沒有手動添加構(gòu)造器,編譯器會默認(rèn)再添加一個無參構(gòu)造器* 如果手動添加了構(gòu)造器(無論什么形式),默認(rèn)構(gòu)造器就會消失*/public Student() {System.out.println("無參構(gòu)造器");}public Student(int a) {System.out.println("一個參數(shù)的構(gòu)造器");age = 15;}public Student(int a, String s) {System.out.println("兩個參數(shù)的構(gòu)造器");age = a;name = s;} }構(gòu)造方法的作用:
構(gòu)造方法在創(chuàng)建對象時調(diào)用,具體調(diào)用哪一個由參數(shù)決定。
構(gòu)造方法的作用是為正在創(chuàng)建的對象的成員變量賦初值。
public class Test {public static void main(String[] args) {//調(diào)用無參構(gòu)造器Student s1 = new Student();//調(diào)用有參構(gòu)造器Student s2 = new Student(15);System.out.println(s2.age);Student s3 = new Student(34, "小明");System.out.println(s3.name + ":" + s3.age);}}構(gòu)造方法種this的使用:
構(gòu)造方法種可以使用this,表示剛剛創(chuàng)建的對象
構(gòu)造方法種this可用于
this訪問對象屬性
this訪問實例方法
this在構(gòu)造方法中調(diào)用重載的其他構(gòu)造方法(要避免陷入死循環(huán))
只能位于第一行
不會觸發(fā)新對象的創(chuàng)建
public class Student {public String name;public int age;public void eat() {System.out.println("eat....");}//構(gòu)造器//使用this()調(diào)用重載構(gòu)造器不能同時相互調(diào)用,避免陷入死循環(huán)public Student() {//this()必須出現(xiàn)在構(gòu)造器的第一行,不會創(chuàng)建新的對象this(15);//調(diào)用了具有int類型參數(shù)的構(gòu)造器System.out.println("默認(rèn)構(gòu)造器");}public Student(int a) {this.eat();eat();//this.可以省略}//this在構(gòu)造器中表示剛剛創(chuàng)建的對象public Student(int a, String s) {System.out.println("兩個參數(shù)的構(gòu)造器");this.age = a;this.name = s;} } public class Test {public static void main(String[] args) {Student s1 = new Student(15, "小明");System.out.println(s1.name + ":" + s1.age);Student s2 = new Student(12, "小紅");System.out.println(s2.name + ":" + s2.age);Student s3 = new Student();} }歸納this在實例方法和構(gòu)造方法種的作用
this是java多態(tài)的體現(xiàn)之一
this只可以在構(gòu)造方法和實例方法種存在,不能出現(xiàn)在static修飾的方法或代碼塊中
this在構(gòu)造方法中表示剛剛創(chuàng)建的對象
this在實例方法種表示調(diào)用改方法的對象
this可以在實例方法和構(gòu)造方法中訪問對象屬性和實例方法
this有時可以省略
this可以在實例方法中作為返回值
this可以當(dāng)作實參
this可調(diào)用重載的構(gòu)造方法
一.構(gòu)造方法的定義聲明
構(gòu)造方法的名字必須和所在類的名字一致,沒有返回值,但不能聲明void,訪問權(quán)限可以為任意,但是一般情況下使用public方法權(quán)限,構(gòu)造方法中的參數(shù)可以根據(jù)需要自行定義,參數(shù)的不同的構(gòu)造方法構(gòu)成重載;
例:
class Fu{public Fu(){} //無參的公有構(gòu)造方法public Fu(int i){} //參數(shù)類型為int的公有構(gòu)造方法......}public class Demo extends Fu{public Demo(){} //無參的公有構(gòu)造方法public Demo(int i){} //參數(shù)類型為int的公有構(gòu)造方法public Demo(int i,double d){} //參數(shù)類型為int和double的公有構(gòu)造方法...}二.構(gòu)造方法的使用
java中構(gòu)造方法的使用有兩個地方,一個是跟在關(guān)鍵字new后面,類名加上一個小括號(),小括號內(nèi)根據(jù)實際加上實參,另外一個是跟在關(guān)鍵字super或this后加上一個小括號(),小括號內(nèi)根據(jù)實際添加實參,下面進(jìn)行舉例。
例1:
Demo demo = new Demo(); //這里是調(diào)用的是一個無參的構(gòu)造方法,必須聲明在方法中,最好聲明在主方法
上面構(gòu)造方法的參數(shù)根據(jù)實際添加實參,jvm根據(jù)構(gòu)造方法的參數(shù)不同加載不同的構(gòu)造方法;
例2:
public Demo(){this(2); //這里調(diào)用參數(shù)為int類型的本類的構(gòu)造方法}例3:
public Demo(){super(1); //調(diào)用參數(shù)為int類型的父類的構(gòu)造方法}注意:例2和例3中this或super調(diào)用構(gòu)造方法只能出現(xiàn)在構(gòu)造方法中,而且必須出現(xiàn)在第一行,所以一個構(gòu)造方法中第一行只能為this或super調(diào)用構(gòu)造方法,兩者不能同時調(diào)用構(gòu)造方法出現(xiàn),而且注意this或super調(diào)用構(gòu)造方法時,要留構(gòu)造方法出口,意思就是最后調(diào)用的構(gòu)造方法中沒有再調(diào)用別的構(gòu)造方法!
三.構(gòu)造方法的作用
1.為了初始化成員屬性,而不是初始化對象,初始化對象是通過new關(guān)鍵字實現(xiàn)的
2.通過new調(diào)用構(gòu)造方法初始化對象,編譯時根據(jù)參數(shù)簽名來檢查構(gòu)造函數(shù),稱為靜態(tài)聯(lián)編和編譯多態(tài)
(參數(shù)簽名:參數(shù)的類型,參數(shù)個數(shù)和參數(shù)順序)
3.創(chuàng)建子類對象會調(diào)用父類構(gòu)造方法但不會創(chuàng)建父類對象,只是調(diào)用父類構(gòu)造方法初始化父類成員屬性;
我總是要把構(gòu)造器和方法混淆,后來發(fā)現(xiàn),
方法,實際上,是需要用于執(zhí)行java代碼的,而構(gòu)造器,
構(gòu)造器,,,是一個類的實例!!
為什么呢?
類的實例,我們需要用類來創(chuàng)建對象,進(jìn)而訪問其屬性,因為實例是需要被用來調(diào)用的,但是調(diào)用的話,我們不得不去考慮一個問題,就是對象,最終是被存儲在內(nèi)存里面的,而存儲的時候,我們的內(nèi)存不得不需要給他再另外開辟新的內(nèi)存空間,那么,java是如何給這種我們所需要的類來開辟內(nèi)存空間的呢?這就涉及到了java的內(nèi)存機(jī)制,就是說,我們必須要給這個類制作一個構(gòu)造器,而且這個構(gòu)造器的名稱必須和這個類的名稱是一致的,這樣,我們的java編譯器才能識別這個類,進(jìn)而給這個類在內(nèi)存中開辟內(nèi)存空間,也就是我們所說的,我們手動,人為的給他進(jìn)行“初始化”,事例如下:
class Rock {Rock() {System.out.print("Rock");}}這樣,當(dāng)我們在對Rock類進(jìn)行調(diào)用的時候,我們的java編譯器就會事先對他進(jìn)行“自動”地初始化,開辟內(nèi)存空間
那么現(xiàn)在問題又來了,舉個例子,我們的Rock()方法需要帶有一個參數(shù),形參,但是整個代碼中,需要不僅僅是帶有形參的Rock();還需要不帶形參的Rock(),在我們的構(gòu)造器對類進(jìn)行構(gòu)造的時候,需要將功能類似的,但形參不同的方法同時打包在該類下,以便在我們調(diào)用某個方法的時候,直接重載構(gòu)造器中的該方法,可以說,這種構(gòu)造形式,滿足了我們對功能類似,形參不同的方法,調(diào)用的時候,進(jìn)行重載,而滿足了編譯器自動初始化,人不需要手動初始化的需求。
而且有個,問題,本來兩個方法,功能上是類似的,一棵樹和一株樹苗,你非得要給他們起不同的名字,多別扭,好在有了構(gòu)造器,能夠是功能相似的方法起相同的名字,不同的參數(shù),而能夠在被調(diào)用的時候得以重載,多么牛逼的構(gòu)造器 啊
總結(jié)
以上是生活随笔為你收集整理的构造器是什么?(Java篇)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重写toString()方法(Java篇
- 下一篇: 单链表删除、修改和查找