世界局勢(shì)最新消息馮耀宗seo博客
繼承:
使用情景:當(dāng)類(lèi)與類(lèi)之間,存在相同(共性)的內(nèi)容,并滿(mǎn)足子類(lèi)是父類(lèi)的一種,就可以考慮使用繼承,來(lái)優(yōu)化代碼
- Java中提供一個(gè)關(guān)鍵字extends,用這個(gè)關(guān)鍵字,我們可以讓一個(gè)類(lèi)和另一個(gè)類(lèi)建立起繼承關(guān)系? ? ? ? ? ? public class Student extends Person{};
- Student被稱(chēng)為子類(lèi)(派生類(lèi)),person稱(chēng)為父類(lèi)(基類(lèi)或超類(lèi))
繼承的格式:public class 子類(lèi) extends 父類(lèi){}?
使用繼承的好處
- 可以把多個(gè)子類(lèi)中重復(fù)的代碼抽取到父類(lèi)中了,提高代碼的復(fù)用性
- 子類(lèi)可以在父類(lèi)的基礎(chǔ)上,增加其他功能,使子類(lèi)更強(qiáng)大?
?繼承的特點(diǎn):Java只支持單繼承不支持多繼承,但支持多層繼承
注:
- 單繼承:一個(gè)子類(lèi)只能繼承一個(gè)父類(lèi)
- 不支持多繼承:子類(lèi)不能同時(shí)繼承多個(gè)父類(lèi)
- 多層繼承:子類(lèi)A繼承父類(lèi)B,父類(lèi)B可以繼承父類(lèi)C
- 每一個(gè)類(lèi)都直接或者間接的繼承于Object
- 子類(lèi)只能訪問(wèn)父類(lèi)中非私有的成員
子類(lèi)到底能繼承父類(lèi)中的哪些內(nèi)容:
構(gòu)造方法 | 非私有? ?不能 | private? 不能 |
成員變量 | 非私有? ? 能 | private 能 |
成員方法 | 能被添加入虛方法表? ?能 | 否則不能 |
注:虛方法可以被覆寫(xiě)(Overriding)的方法都可以稱(chēng)作虛方法,因此虛方法并不需要做特殊的聲明,也可以理解為除了用static、final、private修飾之外的所有方法都是虛方法。
特點(diǎn):
1.成員變量的訪問(wèn)特點(diǎn):就近原則(誰(shuí)離我近,我就用誰(shuí))
先在局部位置找然后在本類(lèi)成員位置找然后在父類(lèi)成員位置找,逐級(jí)往上。
若重名,則sout(name);為從局部位置開(kāi)始往上找
sout(this.name);為從本類(lèi)成員位置開(kāi)始往上找
sout(super.name);為從父類(lèi)成員位置開(kāi)始往上找
?2.成員方法的繼承特點(diǎn):
- 直接調(diào)用滿(mǎn)足就近原則:誰(shuí)離我近,我就用誰(shuí)
- super調(diào)用,直接訪問(wèn)父類(lèi)
方法的重寫(xiě)
當(dāng)父類(lèi)的方法不能滿(mǎn)足子類(lèi)現(xiàn)在的需求時(shí),需要進(jìn)行方法重寫(xiě)
書(shū)寫(xiě)格式:在繼承體系中,子類(lèi)出現(xiàn)了和父類(lèi)一模一樣的方法聲明,我們就稱(chēng)子類(lèi)這個(gè)方法是重寫(xiě)的方法
@Override重寫(xiě)注解
- @Override是放在重寫(xiě)后的方法上,校驗(yàn)子類(lèi)重寫(xiě)時(shí)語(yǔ)法是否正確
- 加上注解后如果有紅色波浪線,表示語(yǔ)法錯(cuò)誤。
- 建議重寫(xiě)方法都加@Override注解,代碼安全,優(yōu)雅!
?
?方法重寫(xiě)的注意事項(xiàng)和要求
- 重寫(xiě)方法的名稱(chēng),形參列表必須與父類(lèi)中的一致
- 子類(lèi)重寫(xiě)父類(lèi)方法時(shí),訪問(wèn)權(quán)限必須大于等于父類(lèi)(暫時(shí)了解:空著不寫(xiě)<protected<public )
- 子類(lèi)重寫(xiě)父類(lèi)方法時(shí),返回值類(lèi)型子類(lèi)必須小于等于父類(lèi)
- 建議:重寫(xiě)的方法盡量和父類(lèi)保持一致
- 私有方法不能被重寫(xiě)
- 子類(lèi)不能重寫(xiě)父類(lèi)的靜態(tài)方法
- (5,6點(diǎn)總結(jié))只有被添加到虛方法表中的方法才能被重寫(xiě)
?構(gòu)造方法的繼承特點(diǎn):
- 父類(lèi)中的構(gòu)造方法不會(huì)被子類(lèi)繼承
- 子類(lèi)中所有的構(gòu)造方法默認(rèn)先訪問(wèn)父類(lèi)中的無(wú)參構(gòu)造,再執(zhí)行自己
為什么?
- 子類(lèi)在初始化的時(shí)候,有可能會(huì)使用到父類(lèi)中的數(shù)據(jù),如果父類(lèi)沒(méi)有完成初始化,子類(lèi)將無(wú)法使用父類(lèi)的數(shù)據(jù)
- 子類(lèi)初始化之前,一定要調(diào)用父類(lèi)構(gòu)造方法先完成父類(lèi)數(shù)據(jù)空間的初始化?
怎么調(diào)用父類(lèi)構(gòu)造結(jié)構(gòu)的?
- ?子類(lèi)構(gòu)造方法的第一行語(yǔ)句默認(rèn)都是:super(),不寫(xiě)也存在,且必須在第一行
- 如果想調(diào)用父類(lèi)有參構(gòu)造,必須手動(dòng)寫(xiě)super進(jìn)行調(diào)用
?繼承中構(gòu)造方法的訪問(wèn)特點(diǎn):
- 子類(lèi)不能繼承父類(lèi)的構(gòu)造方法,但是可以通過(guò)super調(diào)用
- 子類(lèi)構(gòu)造方法的第一行,有一個(gè)默認(rèn)的super()
- 默認(rèn)先訪問(wèn)父類(lèi)中無(wú)參的構(gòu)造方法,再執(zhí)行自己
- 如果想要方法文父類(lèi)有參構(gòu)造,必須手動(dòng)書(shū)寫(xiě)
?this、super的使用總結(jié)
- this:理解為一個(gè)變量,表示當(dāng)前方法調(diào)用者的地址值
- super:代表父類(lèi)存儲(chǔ)空間
關(guān)鍵字 | 訪問(wèn)成員變量 | 訪問(wèn)成員方法 | 訪問(wèn)構(gòu)造方法 |
this | this.成員方法 訪問(wèn)本類(lèi)成員方法 | this.成員方法(...) 訪問(wèn)本類(lèi)成員方法 | this(...) 訪問(wèn)本類(lèi)構(gòu)造方法 |
super | super.成員方法 訪問(wèn)父類(lèi)成員方法 | super.成員方法(...) 訪問(wèn)父類(lèi)成員方法 | super(...) 訪問(wèn)父類(lèi)構(gòu)造方法 |
?練習(xí):
package itheimaoopextenceao5;public class Employee {private String id;private String name;private double salary;public Employee() {}public Employee(String id, String name, double salary) {this.id = id;this.name = name;this.salary = salary;}/*** 獲取* @return id*/public String getId() {return id;}/*** 設(shè)置* @param id*/public void setId(String id) {this.id = id;}/*** 獲取* @return name*/public String getName() {return name;}/*** 設(shè)置* @param name*/public void setName(String name) {this.name = name;}/*** 獲取* @return salary*/public double getSalary() {return salary;}/*** 設(shè)置* @param salary*/public void setSalary(double salary) {this.salary = salary;}public String toString() {return "Employee{id = " + id + ", name = " + name + ", salary = " + salary + "}";}public void work(){System.out.println("員工在工作");}public void eat(){System.out.println("吃米飯");}
}
package itheimaoopextenceao5;public class Manager extends Employee {private double bouns;public Manager() {}public Manager(String id, String name, double salary, double bouns) {super(id, name, salary);this.bouns = bouns;}public double getBouns() {return bouns;}public void setBouns(double bouns) {this.bouns = bouns;}@Overridepublic void work(){System.out.println("管理他人");}}
package itheimaoopextenceao5;public class cooker extends Employee {public cooker() {}public cooker(String id, String name, double salary) {super(id, name, salary);}@Overridepublic void work(){System.out.println("廚師正在炒菜");}
}
package itheimaoopextenceao5;public class Test {public static void main(String[] args) {Manager m=new Manager("heima001","zhangsan",4000,2000) ;System.out.println(m.getId()+","+m.getName() +","+m.getSalary() +","+m.getBouns() );m.eat() ;m.work() ;}
}