無意中翻到這條提問,看了很多回答,發(fā)現(xiàn)歧義較重,在這里解答一下,為了避免后邊來的朋友們踩雷
新手學(xué)習(xí)Java在構(gòu)造方法這里很容易踩雷,構(gòu)造方法是用來初始化的,這句勉強(qiáng)沒錯(cuò),可構(gòu)造方法是用來創(chuàng)建對(duì)象的,這句就錯(cuò)了,實(shí)際上,在構(gòu)造方法執(zhí)行之前,類的內(nèi)存空間已經(jīng)開辟完成了,意思就是說對(duì)象已經(jīng)創(chuàng)建了,這步是由new關(guān)鍵字來完成的,而構(gòu)造方法的作用是給類中的變量進(jìn)行初始化賦值
假設(shè),假設(shè)構(gòu)造方法是用來創(chuàng)建對(duì)象用的,就無法解釋抽象類中為什么允許構(gòu)造方法的存在,抽象類無法實(shí)例化,不能被創(chuàng)建,但是抽象類中允許構(gòu)造方法的存在,舉例從側(cè)面證明一下:
abstract class Animal{
String name;
public Animal() {
System.out.println("抽象父類的無參構(gòu)造");
}
abstract void eat();
}
class Dog extends Animal{
public Dog() {
super();
System.out.println("子類的無參構(gòu)造");
}
@Override
void eat(){
}
}
public class Test {
public static void main(String[] args) {
Dog d = new Dog();
System.out.println(d.name);
}
}
隨手敲的很簡陋的一段代碼,不要在意格式上的不嚴(yán)謹(jǐn),領(lǐng)會(huì)精神,這段代碼執(zhí)行后的結(jié)果為:
抽象父類的無參構(gòu)造
子類的無參構(gòu)造
null
當(dāng)執(zhí)行Dog d = new Dog()這句代碼時(shí),大致會(huì)分兩步,一是加載類,開辟類的內(nèi)存空間,這是由new完成的,第二步執(zhí)行構(gòu)造方法,為類中的變量初始化賦值,在執(zhí)行Dog的無參構(gòu)造時(shí),系統(tǒng)會(huì)默認(rèn)調(diào)用父類的無參構(gòu)造,也就是super(),super關(guān)鍵字是對(duì)該類的父類進(jìn)行的引用,它并不是一個(gè)對(duì)象,這也是個(gè)難點(diǎn),感興趣的可以去查一下,而super()這句代碼可以簡單理解為調(diào)用這個(gè)類的父類的無參構(gòu)造
在上述代碼中,父類Animal是一個(gè)抽象類,而抽象類不可被實(shí)例化,如果構(gòu)造方法的作用是創(chuàng)建對(duì)象,在這一步上邏輯就無法自洽,而實(shí)際情況是:抽象類執(zhí)行了構(gòu)造方法,但卻沒有創(chuàng)建對(duì)象,同時(shí)成員變量name也有了初始值null
構(gòu)造方法是一種特殊的方法,與一般的方法不同是:
1.構(gòu)造方法的名字必須與定義他的類名完全相同,沒有返回類型,甚至連void也沒有。
2.構(gòu)造方法的調(diào)用是在創(chuàng)建一個(gè)對(duì)象時(shí)使用new操作進(jìn)行的。構(gòu)造方法的作用是初始化對(duì)象。
3.不能被static、final、synchronized、abstract和native修飾。構(gòu)造方法不能被子類繼承。
class RectConstructor{
double length;
double width;
double area(){
return length*width;
}
//下面這個(gè)方法就是所謂的構(gòu)造方法,沒有返回值,方法名與類名相同~~~
RectConstructor(double width,double length){//帶參數(shù)的構(gòu)造方法
this.length=length;
this.width=width;
}
}
其實(shí)構(gòu)造方法就是為了給類中成員賦初值~~~~~~~~~~~~~
構(gòu)造方法和實(shí)例方法的區(qū)別 一、主要的區(qū)別在于三個(gè)方面:修飾符、返回值、命名1、和實(shí)例方法一樣,構(gòu)造器可以有任何訪問的修飾符,public、private、protected或者沒有修飾符 ,都可以對(duì)構(gòu)造方法進(jìn)行修飾。
不同于實(shí)例方法的是構(gòu)造方法不能有任何非訪問性質(zhì)的修飾符修飾,例如static、final、synchronized、abstract等都不能修飾構(gòu)造方法。解釋:構(gòu)造方法用于初始化一個(gè)實(shí)例對(duì)象,所以static修飾是沒有任何意義的;多個(gè)線程不會(huì)同時(shí)創(chuàng)建內(nèi)存地址相同的同一個(gè)對(duì)象,所以synchronized修飾沒有意義; 構(gòu)造方法不能被子類繼承,所以final和abstract修飾沒有意義。
2、返回類型是非常重要的,實(shí)例方法可以返回任何類型的值或者是無返回值(void),而構(gòu)造方法是沒有返回類型的,void也不行。3、至于命名就是構(gòu)造方法與類名相同,當(dāng)然了實(shí)例方法也可以與類名相同,但是習(xí)慣上我們?yōu)閷?shí)例方法命名的時(shí)候通常是小寫的,另一方面也是與構(gòu)造方法區(qū)分開。
而構(gòu)造方法與類名相同,所以首字母一般大寫。下面看幾個(gè)例子熟悉一下: publicclassSample { privateintx; publicSample() { // 不帶參數(shù)的構(gòu)造方法 this(1); } publicSample(intx) { //帶參數(shù)的構(gòu)造方法 this.x=x; } publicintSample(intx) { //不是構(gòu)造方法 returnx++; } } 上面的例子即使不通過注釋我們也很容易能區(qū)分開的,再看下面一個(gè)例子 publicclassMystery { privateString s; publicvoidMystery() { //不是構(gòu)造方法 s = "constructor"; } voidgo() { System.out.println(s); } publicstaticvoidmain(String[] args) { Mystery m = newMystery(); m.go(); } } 程序執(zhí)行的結(jié)果為null,雖然說Mystery m = new Mystery();調(diào)用了Mystery 類的構(gòu)造方法,但是public void Mystery()并不是構(gòu)造方法,他只是一個(gè)普通的實(shí)例方法而已,那該類的構(gòu)造方法哪去了呢?二、說到這就得說一下java的默認(rèn)構(gòu)造方法 我們知道,java語言中規(guī)定每個(gè)類至少要有一個(gè)構(gòu)造方法,為了保證這一點(diǎn),當(dāng)用戶沒有給java類定義明確的構(gòu)造方法的時(shí)候,java為我們提供了一個(gè)默認(rèn)的構(gòu)造方法,這個(gè)構(gòu)造方法沒有參數(shù),修飾符是public并且方法體為空。
如果用戶有定義構(gòu)造方法,就不會(huì)有默認(rèn)構(gòu)造方法!?。∑鋵?shí)默認(rèn)的構(gòu)造方法還分為兩種,一種就是剛剛說過的隱藏的構(gòu)造方法,另一種就是顯示定義的默認(rèn)構(gòu)造方法.如果一個(gè)類中定義了一個(gè)或者多個(gè)構(gòu)造方法,并且每一個(gè)構(gòu)造方法都是帶有參數(shù)形式的,那么這個(gè)類就沒有默認(rèn)的構(gòu)造方法,看下面的例子。123456789 publicclassSample1{} publicclassSample2{ publicSample2(inta){System.out.println("My Constructor");} } publicclassSample3{ publicSample3(){System.out.println("My Default Constructor");} } 上面的三個(gè)類中Sample1有一個(gè)隱式的默認(rèn)構(gòu)造方法,下列語句Sample1 s1=new Sample()合法; Sample2沒有默認(rèn)的構(gòu)造方法,下列語句Sample2 s2=new Sample2()不合法,執(zhí)行會(huì)編譯錯(cuò)誤 Sample3有一個(gè)顯示的默認(rèn)構(gòu)造方法,所以以下語句Sample3 s3=new Sample3();合法。
聲明:本網(wǎng)站尊重并保護(hù)知識(shí)產(chǎn)權(quán),根據(jù)《信息網(wǎng)絡(luò)傳播權(quán)保護(hù)條例》,如果我們轉(zhuǎn)載的作品侵犯了您的權(quán)利,請(qǐng)?jiān)谝粋€(gè)月內(nèi)通知我們,我們會(huì)及時(shí)刪除。
蜀ICP備2020033479號(hào)-4 Copyright ? 2016 學(xué)習(xí)鳥. 頁面生成時(shí)間:3.254秒