溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何在Java項(xiàng)目中使用繼承構(gòu)造器

發(fā)布時(shí)間:2021-03-22 17:32:55 來(lái)源:億速云 閱讀:169 作者:Leah 欄目:編程語(yǔ)言

本篇文章為大家展示了如何在Java項(xiàng)目中使用繼承構(gòu)造器,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

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

先看一段簡(jiǎn)單的測(cè)試代碼:

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對(duì)象
    new PrimaryStudent();
  }
}
/*
 Person()
 Student()
 PrimaryStudent()
*/

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

可以看到的是:

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

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

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

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

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

package com.my.pac13;
/*調(diào)用基類構(gòu)造器是子類構(gòu)造器中要做的第一件事*/
public class Person {
  //沒(méi)有默認(rèn)構(gòu)造器
  Person(String name){
    System.out.println("Person()\t"+name);
  }
}
class Student extends Person{
  //也沒(méi)有默認(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)無(wú)參數(shù)構(gòu)造器,但是父類沒(méi)有,所以要用super顯式調(diào)用
  PrimaryStudent(){
  //沒(méi)有下面的語(yǔ)句會(huì)報(bào)錯(cuò)
    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 hello
PrimaryStudent()
***********
 */
  • this是正在創(chuàng)建的對(duì)象,用于調(diào)用同一類中重載的構(gòu)造器,可以參看我之前的文章:Java關(guān)鍵字之this。

  • super在調(diào)用構(gòu)造器時(shí),使用方法和this相似。(但super和this本身有本質(zhì)的不同,super并不是一個(gè)對(duì)象的引用?。。。?/p>

  • super和this語(yǔ)句都必須出現(xiàn)在第一行,也就是說(shuō)一個(gè)構(gòu)造器中只能有其中之一。

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

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

子類構(gòu)造器A在第一行顯式使用super調(diào)用父類構(gòu)造器B,格式super(參數(shù)列表),根據(jù)參數(shù)列表選擇對(duì)應(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)造器中沒(méi)有super和this時(shí),系統(tǒng)會(huì)隱式調(diào)用父類的無(wú)參構(gòu)造器,要是沒(méi)有無(wú)參的,那就報(bào)錯(cuò)。

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

上述內(nèi)容就是如何在Java項(xiàng)目中使用繼承構(gòu)造器,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI