Java繼承構(gòu)造器怎么用

這篇文章給大家分享的是有關(guān)Java繼承構(gòu)造器怎么用的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

創(chuàng)新互聯(lián)公司是一家從事企業(yè)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)制作、網(wǎng)站建設(shè)、行業(yè)門戶網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)制作的專業(yè)網(wǎng)絡(luò)公司,擁有經(jīng)驗(yàn)豐富的網(wǎng)站建設(shè)工程師和網(wǎng)頁設(shè)計(jì)人員,具備各種規(guī)模與類型網(wǎng)站建設(shè)的實(shí)力,在網(wǎng)站建設(shè)領(lǐng)域樹立了自己獨(dú)特的設(shè)計(jì)風(fēng)格。自公司成立以來曾獨(dú)立設(shè)計(jì)制作的站點(diǎn)上1000家。

初始化基類

前面提到,繼承是子類對父類的拓展?!禩hinking in Java》中提到下面一段話:

當(dāng)創(chuàng)建一個(gè)導(dǎo)出類的對象時(shí),該對象包含了一個(gè)基類的子對象。這個(gè)子對象與你用基類直接創(chuàng)建的對象是一樣的。二者區(qū)別在于,后者來自于外部,而基類的子對象被包裝在導(dǎo)出類的對象內(nèi)部。

我們在創(chuàng)建子類對象時(shí),調(diào)用了父類的構(gòu)造器,甚至父類的父類構(gòu)造器。我們知道,構(gòu)造器用于創(chuàng)建對象,那么突然產(chǎn)生疑惑:關(guān)于創(chuàng)建一個(gè)子類對象時(shí),是否會先創(chuàng)建父類對象?

經(jīng)過查找資料,得出結(jié)論:

并沒有。在創(chuàng)建子類對象時(shí),會把父類的成員變量和方法加載進(jìn)內(nèi)存,既然要加載,便調(diào)用父類構(gòu)造器看看這些數(shù)據(jù)是如何進(jìn)行初始化的,僅此而已,并不是創(chuàng)建了父類的對象。

所以,可以看作,子類對象中包含著父類的子對象。我們知道,對象的初始化是至關(guān)重要的。那么,這個(gè)父類的子對象如何正確初始化呢?對了,就是接下來要說的:在構(gòu)造器中調(diào)用基類構(gòu)造器來執(zhí)行初始化。注意:子類并不能繼承父類的構(gòu)造器,只是單純調(diào)用了基類構(gòu)造器中的初始化代碼。

默認(rèn)構(gòu)造器

先看一段簡單的測試代碼:

package com.my.pac13;/*繼承中的構(gòu)造*/public class Person {  Person(){    System.out.println("Person()");  }}class Student extends Person{  Student(){    System.out.println("Student()");  }}class PrimaryStudent extends Student{  PrimaryStudent(){    //super();    System.out.println("PrimaryStudent()");  }  public static void main(String[] args) {    //創(chuàng)建了PrimaryStudent對象    new PrimaryStudent();  }}/* Person() Student() PrimaryStudent()*/

關(guān)于構(gòu)造器,我們前面提到,任何沒有顯式構(gòu)造器的類都存在著一個(gè)無參數(shù)的默認(rèn)構(gòu)造器。我們上面的例子在默認(rèn)構(gòu)造器中加入了打印輸出,以便理解。

可以看到的是:

在創(chuàng)建PrimaryStudent時(shí),他的直接父類Student和間接父類Person中的構(gòu)造器都被調(diào)用了,而且可以看到,是"自上而下"的。父類在子類構(gòu)造器可以訪問它之前,就已經(jīng)完成了初始化的操作。

若子類沒有顯式調(diào)用父類的構(gòu)造器,則自動調(diào)用父類的默認(rèn)(無參)構(gòu)造器。

帶參數(shù)的構(gòu)造器

前面的代碼中,每個(gè)類都含有默認(rèn)的構(gòu)造器,創(chuàng)建子類對象時(shí),是自上而下,且子類會默認(rèn)調(diào)用父類的無參構(gòu)造器。那么,假設(shè)父類正好沒有無參構(gòu)造器或者你正想調(diào)用父類的帶參構(gòu)造器,這時(shí)就需要我們的super關(guān)鍵字。(super關(guān)鍵字之后還會進(jìn)行總結(jié))

我們直接在原來的基礎(chǔ)上稍作修改,并進(jìn)行測試。

package com.my.pac13;/*調(diào)用基類構(gòu)造器是子類構(gòu)造器中要做的第一件事*/public class Person {  //沒有默認(rèn)構(gòu)造器  Person(String name){    System.out.println("Person()\t"+name);  }}class Student extends Person{  //也沒有默認(rèn)構(gòu)造器,且用super顯式調(diào)用  Student(String n){  //super關(guān)鍵字調(diào)用父類的構(gòu)造器    super(n);    System.out.println("一參數(shù)Student\t"+n);  }  Student(String n,String m){  //this關(guān)鍵字調(diào)用同一類中重載的構(gòu)造器    this(n);    System.out.println("二參數(shù)student()\t"+m);  }}class PrimaryStudent extends Student{  //隱式調(diào)用父類構(gòu)無參數(shù)構(gòu)造器,但是父類沒有,所以要用super顯式調(diào)用  PrimaryStudent(){  //沒有下面的語句會報(bào)錯    super("hello");    System.out.println("PrimaryStudent()");  }}class ExtendsTest{  public static void main(String[] args) {    new Person("the shy");    System.out.println("***********");    new Student("rookie");    System.out.println("***********");    new Student("the shy","rookie");    System.out.println("***********");    new PrimaryStudent();    System.out.println("***********");  }}/*Person()  the shy***********Person()  rookie一參數(shù)Student rookie***********Person()  the shy一參數(shù)Student the shy二參數(shù)student()  rookie***********Person()  hello一參數(shù)Student helloPrimaryStudent()*********** */

this是正在創(chuàng)建的對象,用于調(diào)用同一類中重載的構(gòu)造器,可以參看我之前的文章:Java關(guān)鍵字之this。  super在調(diào)用構(gòu)造器時(shí),使用方法和this相似。(但super和this本身有本質(zhì)的不同,super并不是一個(gè)對象的引用?。。。? super和this語句都必須出現(xiàn)在第一行,也就是說一個(gè)構(gòu)造器中只能有其中之一。

子類調(diào)用父類構(gòu)造器

無論是否使用super語句來調(diào)用父類構(gòu)造器的初始化代碼,子類構(gòu)造器總是會事先調(diào)用父類構(gòu)造器!這是一定要記住的!

子類構(gòu)造器A在第一行顯式使用super調(diào)用父類構(gòu)造器B,格式super(參數(shù)列表),根據(jù)參數(shù)列表選擇對應(yīng)的父類構(gòu)造器。

//父類 Person(String name){    System.out.println("Person()\t"+name);  }//子類 Student(String n){  //super關(guān)鍵字調(diào)用父類的構(gòu)造器    super(n);    System.out.println("一參數(shù)Student\t"+n);  }

子類構(gòu)造器A先用this調(diào)用本類重載的構(gòu)造器B,然后B調(diào)用父類構(gòu)造器。

//父類 Person(String name){    System.out.println("Person()\t"+name);  }//子類Student(String n){  //super關(guān)鍵字調(diào)用父類的構(gòu)造器    super(n);    System.out.println("一參數(shù)Student\t"+n);  }Student(String n,String m){//this關(guān)鍵字調(diào)用同一類中重載的構(gòu)造器  this(n);  System.out.println("二參數(shù)student()\t"+m);}

子類構(gòu)造器中沒有super和this時(shí),系統(tǒng)會隱式調(diào)用父類的無參構(gòu)造器,要是沒有無參的,那就報(bào)錯。

//隱式調(diào)用父類構(gòu)無參數(shù)構(gòu)造器,但是父類沒有,所以要用super顯式調(diào)用PrimaryStudent(){//沒有下面的語句會報(bào)錯  super("hello");  System.out.println("PrimaryStudent()");}

綜上所述:

當(dāng)調(diào)用子類構(gòu)造器對子類對象進(jìn)行初始化時(shí),父類構(gòu)造器總會在子類構(gòu)造器之前執(zhí)行。甚至,父類的父類會在父類之前執(zhí)行……一直追溯到所有類的超類Object類的構(gòu)造器。

感謝各位的閱讀!關(guān)于“Java繼承構(gòu)造器怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

新聞標(biāo)題:Java繼承構(gòu)造器怎么用
分享地址:http://bm7419.com/article30/jcsgso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計(jì)公司、小程序開發(fā)、電子商務(wù)響應(yīng)式網(wǎng)站、搜索引擎優(yōu)化外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司