面向?qū)ο蟮牡诙筇攸c(diǎn)就是繼承:而繼承的主要作用在于决帖,在已有基礎(chǔ)上繼續(xù)進(jìn)行功能的擴(kuò)充茸时。
一. 繼承問(wèn)題的引出
如果要想更好的解析繼承的作用担租,下面按照之前所學(xué)習(xí)到的概念來(lái)定義兩個(gè)類:人類叙赚、學(xué)生類德撬。那么現(xiàn)在的定義效果如下:
class Person {
private String name ;
private int age ;
public void setName(String name) {
this.name = name ;
}
public void setAge(int age) {
this.age = age ;
}
public String getName() {
return this.name ;
}
public int getAge() {
return this.age ;
}
}
class Student {
private String name ;
private int age ;
private String school ;
public void setName(String name) {
this.name = name ;
}
public void setAge(int age) {
this.age = age ;
}
public String getName() {
return this.name ;
}
public int getAge() {
return this.age ;
}
public void setSchool(String school) {
this.school = school ;
}
public String getSchool() {
return this.school ;
}
}
發(fā)現(xiàn)Student類具備Person類中的所有屬性毛雇,兩個(gè)簡(jiǎn)單Java類中存在大量的重復(fù)內(nèi)容。
二. 繼承的實(shí)現(xiàn)
在Java之中繼承使用extends關(guān)鍵字來(lái)進(jìn)行實(shí)現(xiàn),其定義的語(yǔ)法如下:
●繼承關(guān)系:class 子類 extends 父類搔预;
|-子類在一些書上也被稱為派生類;
|-父類也被稱為超類(Super Class)叶组。
繼承可以進(jìn)行父類功能的擴(kuò)充拯田,并且最重要的是可以重用父類中定義的方法。
三. 繼承使用限制
雖然從本質(zhì)上來(lái)講繼承子類可以對(duì)父類操作進(jìn)行共享甩十,但是從另外一個(gè)角度來(lái)說(shuō)船庇,繼承本身也是存在有一些限制的。
1. 子類對(duì)象在進(jìn)行實(shí)例化前一定會(huì)首先實(shí)例化父類對(duì)象侣监,默認(rèn)調(diào)用父類的構(gòu)造方法后鸭轮,再調(diào)用子類的構(gòu)造方法進(jìn)行子類對(duì)象實(shí)例化。
●必須先有老子橄霉,才有后代窃爷;
class Person {
public Person() {
System.out.println("*** Person類對(duì)象創(chuàng)建 ***") ;
}
}
class Student extends Person {
public Student() {
//super() ; ? // 此語(yǔ)句在無(wú)參時(shí)寫與不寫一樣,有的時(shí)候一定得放在首行姓蜂,類似于this()按厘。
System.out.println("*** Student類對(duì)象創(chuàng)建 ***") ;
}
}
public class MeDemo {
public static void main (String args[]) {
new Student() ; ?//進(jìn)行子類對(duì)象實(shí)例化
}
}
發(fā)現(xiàn)沒(méi)有任何一條語(yǔ)句會(huì)明確調(diào)用父類構(gòu)造,但是父類構(gòu)造依然被執(zhí)行了钱慢,所以就證明逮京,子類對(duì)象的實(shí)例化一定會(huì)同時(shí)實(shí)例化其父類對(duì)象。
但是同時(shí)需要注意的是束莫,如果此時(shí)你的父類里面沒(méi)有提供有無(wú)參構(gòu)造造虏,那么這個(gè)時(shí)候就必須使用super()明確的指明你的父類構(gòu)造方法。
2. Java中只允許單繼承麦箍,不允許多繼承漓藕;
一個(gè)子類只能繼承一個(gè)父類;
范例: 錯(cuò)誤繼承方式
class A {}
class B {}
class C extends A,B {}
實(shí)際上這個(gè)時(shí)候的C類要同時(shí)繼承A和B類的主要目的是為了同時(shí)擁有A和B類中的操作挟裂,所以為了實(shí)現(xiàn)這樣的概念可以采用多層繼承的形式完成享钞。
class A {}
class B extends A {}
class C extends B {}
但是這個(gè)層不建議太多了。一般我們自己在建立類的時(shí)候,這些類的繼承關(guān)系也就最多是三層栗竖。
Tips:Java不允許多重繼承暑脆,但是允許多層繼承。
3. 在進(jìn)行繼承的時(shí)候狐肢,子類會(huì)繼承父類的所有結(jié)構(gòu)添吗,但是這個(gè)時(shí)候需要注意的是,所有的非私有操作屬于顯式繼承(可以直接調(diào)用)份名,而所有的私有操作屬于隱式繼承(通過(guò)其他形式調(diào)用碟联,例如:setter、getter)僵腺。
此時(shí)父類中的屬性的確被子類所繼承了鲤孵,但是發(fā)現(xiàn)子類能夠使用的只是所有的非private操作(public),而所有的private操作肯定無(wú)法直接使用辰如,所以稱為隱式繼承普监。
總結(jié):
①繼承的語(yǔ)法以及繼承的目的(擴(kuò)展已有類的功能,使代碼重用)琉兜;
②子類對(duì)象的實(shí)例化流程:不管如何操作一定喲啊首先實(shí)例化父類對(duì)象凯正,而后再實(shí)例化子類對(duì)象;
③繼承的限制:不允許多重繼承豌蟋,只允許多層繼承廊散。