Java繼承關(guān)系中構(gòu)造器的使用詳解
本文講的是有繼承關(guān)系的兩個(gè)類之間,使用構(gòu)造器的細(xì)節(jié)。在看之前,請(qǐng)確定你已經(jīng)了解了“構(gòu)造器”和“繼承”基礎(chǔ)的語(yǔ)法知識(shí)。
如果你對(duì)構(gòu)造器和繼承比較了解,可以直接跳過(guò)前面的基本介紹,直接看后面的繼承中構(gòu)造器的使用即可。
先簡(jiǎn)單介紹一下構(gòu)造器基礎(chǔ):構(gòu)造器是一個(gè)類在實(shí)例化(創(chuàng)建)一個(gè)對(duì)象的時(shí)候,給對(duì)象初始化的一個(gè)特殊方法。打個(gè)比方:
public class temp {
public static void main(String[] args) {
//創(chuàng)建一個(gè)person對(duì)象,并初始化對(duì)象的name 和 age
Person person = new Person("jack",18);
}
}
class Person {
String name;
int age;
//帶有兩個(gè)參數(shù)的構(gòu)造器
public Person(String name , int age){
this.name = name;
this.age =age;
}
}這里就是運(yùn)用兩個(gè)參數(shù)的構(gòu)造器初始化了一個(gè)對(duì)象,當(dāng)然你可能會(huì)想,如果我寫Person(String name , int age)構(gòu)造器,那么在創(chuàng)建方法的時(shí)候是不是就不會(huì)使用構(gòu)造器了?
答案是:當(dāng)然不會(huì),如果我們不定義構(gòu)造器,那么類里面默認(rèn)有一個(gè)無(wú)參構(gòu)造器,顧名思義就算沒(méi)有參數(shù)的構(gòu)造器,在創(chuàng)建對(duì)象的時(shí)候不對(duì)其進(jìn)行初始化。但是這個(gè)構(gòu)造器是存在的,只是沒(méi)什么用。
而且這個(gè)無(wú)參構(gòu)造器在我們定義了一個(gè)有參數(shù)的構(gòu)造器之后就被覆蓋了(直接無(wú)了),此時(shí)如果我們?cè)僦苯?進(jìn)行無(wú)參創(chuàng)建,就會(huì)報(bào)錯(cuò)。

如果我們還想使用無(wú)參構(gòu)造器,那么就需要在類中顯式聲明一下即可
class Person {
String name;
int age;
//顯式聲明無(wú)參構(gòu)造器
public Person(){
}
//帶有兩個(gè)參數(shù)的構(gòu)造器
public Person(String name , int age){
this.name = name;
this.age =age;
}
}當(dāng)然說(shuō)這么多,你只需要知道一條:在創(chuàng)建對(duì)象的時(shí)候一定會(huì)調(diào)用一次構(gòu)造器,不管是無(wú)參的還是有參的。
然后是關(guān)于繼承的,這里也簡(jiǎn)單說(shuō)一下:繼承就是一個(gè)類(子類)通過(guò) extend 來(lái)使其具備所繼承類(父類)的屬性與成員方法。
打個(gè)比方,我有兩個(gè)類:Person,Doctor。其中Person有屬性name,age。Doctor里面也有name和age。我們就可以讓Doctor繼承Perosn來(lái)獲得其屬性。
再或者Pupil(小學(xué)生)和Gratuation(大學(xué)生)有很多共同屬性,我們可以創(chuàng)建一個(gè)父類Student讓二者繼承父類,來(lái)提高代碼復(fù)用性。
//父類 Student
class Student {
public String name;
public int age;
public double score;
}
//子類 Pupil
class Pupil extends Student {
//其擁有父類Student里面的所有屬性
}
//子類Gratuate
class Gratuate extends Student{
//其擁有父類Student里面的所有屬性
}
OK,現(xiàn)在進(jìn)入正題,現(xiàn)在我們有一個(gè)子類Son,一個(gè)父類Base。Son繼承了Base里面的屬性和成員方法
//父類
class Base {
//顯式聲明一下無(wú)參構(gòu)造器
public Base() {
System.out.println("父類Base中的構(gòu)造器Base()被調(diào)用");
}
}
//子類
class Son extends Base {
public Son() {
//顯式聲明一下無(wú)參構(gòu)造器
System.out.println("子類Son的構(gòu)造器Son()被調(diào)用");
}
}
//主程序
public class Run {
public static void main(String[] args) {
Son son = new Son();
}
}Public
現(xiàn)在我們創(chuàng)建了一個(gè)Son類,這時(shí)候程序會(huì)有以下輸出

我們就可以得到第一個(gè)特點(diǎn):子類對(duì)象必須調(diào)用父類的構(gòu)造器,完成初始化。
即在new Son()的時(shí)候,在Son的構(gòu)造器初始化之前需要先調(diào)用父類的構(gòu)造器。當(dāng)父類中的無(wú)參構(gòu)造器存在的時(shí)候,這個(gè)過(guò)程可以自動(dòng)進(jìn)行,不需要我們手動(dòng)調(diào)用。
那么如果父類的無(wú)參構(gòu)造器被覆蓋了,會(huì)發(fā)生什么?如果父類沒(méi)有無(wú)參構(gòu)造器,我們就會(huì)發(fā)現(xiàn)我們還按照上面的寫代碼,編譯是不通過(guò)的。
class Son extends Base {
public Son() {
//編譯不通過(guò)
System.out.println("子類Son的構(gòu)造器Son()被調(diào)用");
}
}
class Base {
public Base(int n1) {
System.out.println("父類Base中的構(gòu)造器Base(int n1)被調(diào)用");
}
}因?yàn)榇藭r(shí)系統(tǒng)不知道要調(diào)用父類中的那個(gè)構(gòu)造器,所以此時(shí)需要我們手動(dòng)填寫調(diào)用父類中的那個(gè)構(gòu)造器即:
如果父類中的無(wú)參構(gòu)造器被覆蓋了,而我們也沒(méi)有顯式無(wú)參構(gòu)造器。那么在子類調(diào)用構(gòu)造器的時(shí)候,必須要使用 super() ;方法指明要使用父類中的那個(gè)構(gòu)造器進(jìn)行初始化。
class Son extends Base {
public Son() {
super(2);//使用 Base(int n)構(gòu)造器,傳入一個(gè)int
System.out.println("子類Son的構(gòu)造器Son()被調(diào)用");
}
class Base {
public Base(int n1) {
System.out.println("父類Base中的構(gòu)造器Base(int n1)被調(diào)用");
}需要特別注意的是:super方法只能放在構(gòu)造器的第一行。
總結(jié)一下就是:
1.子類對(duì)象必須調(diào)用父類的構(gòu)造器,完成初始化。
2.如果父類中的無(wú)參構(gòu)造器被覆蓋了,而我們也沒(méi)有顯式無(wú)參構(gòu)造器。那么在子類調(diào)用構(gòu)造器的時(shí)候,必須要使用 super() ;方法指明要使用父類中的那個(gè)構(gòu)造器進(jìn)行初始化。
到此這篇關(guān)于Java繼承關(guān)系中構(gòu)造器的使用詳解的文章就介紹到這了,更多相關(guān)java構(gòu)造器使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Maven的生命周期與自定義插件實(shí)現(xiàn)方法
Maven的生命周期就是對(duì)所有的構(gòu)建過(guò)程進(jìn)行抽象和統(tǒng)一。包含了項(xiàng)目的清理、初始化、編譯、測(cè)試、打包、集成測(cè)試、驗(yàn)證、部署和站點(diǎn)生成等幾乎所有的構(gòu)建步驟2022-12-12
Java基于iText7實(shí)現(xiàn)PDF添加通用文本水印的示例詳解
這篇文章主要為大家詳細(xì)介紹了Java基于iText7實(shí)現(xiàn)PDF添加通用文本水印的相關(guān)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2026-02-02
java用split分割字符串的一個(gè)有趣現(xiàn)象
最近在項(xiàng)目中使用了java中的split分割字符串,發(fā)現(xiàn)了一個(gè)bug,充分了展示了自己對(duì)java底層的認(rèn)知有很多的不足和欠缺。下面將這次的經(jīng)過(guò)總結(jié)出來(lái)分享給大家,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。2016-12-12
SpringBoot中使用websocket出現(xiàn)404的解決方法
在Springboot中使用websocket時(shí),本地開發(fā)環(huán)境可以正常運(yùn)行,但部署到服務(wù)器環(huán)境出現(xiàn)404問(wèn)題,所以本文小編講給大家詳細(xì)介紹一下SpringBoot中使用websocket出現(xiàn)404的解決方法,需要的朋友可以參考下2023-09-09
SpringBoot整合RabbitMQ實(shí)現(xiàn)交換機(jī)與隊(duì)列的綁定
這篇文章將通過(guò)幾個(gè)實(shí)例為大家介紹一些SpringBoot中RabbitMQ如何綁定交換機(jī)(交換器)與隊(duì)列,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-05-05
struts2通過(guò)action返回json對(duì)象
struts2通過(guò)action返回json對(duì)象其實(shí)很簡(jiǎn)單的,首先我們需要引入jar包,然后在寫一個(gè)簡(jiǎn)單的action就好了,接下來(lái)通過(guò)本文給大家介紹struts2通過(guò)action返回json對(duì)象的方法,感興趣的朋友一起看看吧2016-09-09

