1. 面向?qū)ο蟮木幊淘试S你從已經(jīng)存在的類中定義新的類 诅病, 這稱為繼承费就。
2. 繼承使得你可以定義一個(gè)通用的類 ( 即父類 ) 晰洒, 之后擴(kuò)充該類為一個(gè)更加特定的類 ( 即子類 ) 蕾额。
3. super關(guān)鍵字
- 調(diào)用父類的構(gòu)造方法
構(gòu)造方法用于構(gòu)建一個(gè)類的實(shí)例 野建。 不同于屬性和普通方法 娜谊, 父類的構(gòu)造方法不會(huì)被子類繼承 确买。 它們只能使用關(guān)鍵字 super 從子類的構(gòu)造方法中調(diào)用 。
super () 或者 super ( parameters )- 構(gòu)造方法鏈
- 構(gòu)造方法可以調(diào)用重載的構(gòu)造方法或父類的構(gòu)造方法 纱皆。 如果它們都沒有被顯式地調(diào)用 湾趾,編譯器就會(huì)自動(dòng)地將 superO 作為構(gòu)造方法的第一條語句 。
- 在任何情況下 派草, 構(gòu)造一個(gè)類的實(shí)例時(shí) 搀缠, 將會(huì)調(diào)用沿著繼承鏈的所有父類的構(gòu)造方法 。 當(dāng)構(gòu)造一個(gè)子類的對(duì)象時(shí) 近迁, 子類構(gòu)造方法會(huì)在完成自己的任務(wù)之前 艺普, 首先調(diào)用它的父類的構(gòu)造方法 。 如果父類繼承自其他類 鉴竭, 那么父類構(gòu)造方法又會(huì)在完成自己的任務(wù)之前 歧譬, 調(diào)用它自己的父類的構(gòu)造方法 。 這個(gè)過程持續(xù)到沿著這個(gè)繼承體系結(jié)構(gòu)的最后一個(gè)構(gòu)造方法被調(diào)用為止搏存。這就是構(gòu)造方法鏈 ( constructor chaining ) 缴罗。
- 構(gòu)造方法鏈
- 調(diào)用父類的方法 super . 方法名 ( 參數(shù) )
4.方法的重寫
子類從父類中繼承方法 。 有時(shí) 祭埂, 子類需要修改父類中定義的方法的實(shí)現(xiàn) 面氓, 這稱作方法重寫 ( method overriding ) 兵钮。
注意:
- 僅當(dāng)實(shí)例方法是可訪問時(shí) , 它才能被覆蓋 舌界。 因?yàn)樗接蟹椒ㄔ谒念惐旧硪酝馐遣荒茉L問的 掘譬, 所以它不能被覆蓋 。 如果子類中定義的方法在父類中是私有的 呻拌, 那么這兩個(gè)方法完全沒有關(guān)系葱轩。
- 與實(shí)例方法一樣 , 靜態(tài)方法也能被繼承 藐握。 但是 靴拱, 靜態(tài)方法不能被重寫。
- 方法重寫具有同樣的簽名和返回值類型 猾普; 方法重載具有同樣的名字 袜炕, 但是不同的參數(shù)列表 。
5.多態(tài)
- 使用父類對(duì)象的地方都可以使用子類的對(duì)象 ,這就是通常所說的多態(tài)初家。簡(jiǎn)單來說 , 多態(tài)意味著父類型的
變量可以引用子類型的對(duì)象 溜在。 - 動(dòng)態(tài)綁定
Object o = new CeometricObject () ;
System . out . println ( o . toString ( ) );
聲明類型:一個(gè)變量必須被聲明為某種類型 陌知。 變量的這個(gè)類型稱為它的聲明類型 。 這里 掖肋, o 的聲明類型是 Object 仆葡。
實(shí)際類型:被變量引用的對(duì)象的實(shí)際類。 這里 志笼, o 的實(shí)際類型是 GeometricObject , 因?yàn)?o 指向使用 new GeometricObject()創(chuàng)建的對(duì)象浙芙。
o 調(diào)用哪個(gè)toString()方法由 o 的實(shí)際類型決定,這稱為動(dòng)態(tài)綁定籽腕。
6.示例:
- 方法的重寫(僅當(dāng)實(shí)例方法是可訪問時(shí) , 它才能被覆蓋 纸俭,否則是完全不同的兩個(gè)方法)
public class Test1 {
public static void main(String[] args) {
new Personl().printPerson();
new Student().printPerson();
}
}
class Student extends Personl {
//因?yàn)槁暶鞯氖莗rivate皇耗,所以子類的方法與父類的同名方法毫無關(guān)系
//沒有重寫父類的方法
private String getlnfo(){
return "Student";
}
}
class Personl {
private String getlnfo() {
return "Person";
}
//父類調(diào)用父類的getInfo()方法
public void printPerson() {
System . out . println (getlnfo()) ;
}
}
結(jié)果為Person Person
public class Test1 {
public static void main(String[] args) {
new Personl().printPerson();
new Student().printPerson();
}
}
class Student extends Personl {
//聲明為public,子類重寫了父類的方法揍很,在子類對(duì)象調(diào)用時(shí)郎楼,會(huì)使用重寫的方法
public String getlnfo(){
return "Student";
}
}
class Personl {
public String getlnfo() {
return "Person";
}
//父類調(diào)用父類的getInfo()方法,但如果是子類對(duì)象調(diào)用窒悔,父類的getInfo方法已經(jīng)被重寫
public void printPerson() {
System . out . println (getlnfo()) ;
}
}
結(jié)果 Person Student
- 創(chuàng)建一個(gè)對(duì)象時(shí) 構(gòu)造函數(shù)的運(yùn)行過程:先調(diào)用父類的構(gòu)造函數(shù)呜袁,再調(diào)用子類的構(gòu)造函數(shù)
ackage java_04_基礎(chǔ)習(xí)題練習(xí).第11章_繼承和多態(tài);
/**
*
*/
public class Test2_構(gòu)造函數(shù)執(zhí)行順序 {
public static void main(String[] args){
A a=new A(3);
}
}
class A extends B{
public A(int t){
System.out.println("A's constructor is invoked");
}
}
class B{
public B(){
System.out.println("B's constructor is invoked");
}
}
public class Test3 {
public static void main(String[] args){
//直接調(diào)用A1的構(gòu)造函數(shù),i=40
new A1();
//1.B1繼承自A1简珠,先去執(zhí)行A1阶界,給i賦值i=7虹钮;
//2.調(diào)用A1的構(gòu)造函數(shù),由于setI()方法被子類重寫膘融,所以此時(shí)調(diào)用的是子類的setI()方法芙粱,i=60
//3.i from A is 60
//4.調(diào)用B1的構(gòu)造函數(shù),i在A1中已經(jīng)被賦值60氧映,所以i from B is 60
new B1();
}
}
class A1{
int i=7;
public A1(){
setI(20);
System.out.println("i from A is "+i);
}
public void setI(int i){
this.i=2*i;
}
}
class B1 extends A1{
public B1(){
System.out.println("i from B is "+i);
}
public void setI(int i){
this.i=3*i;
}
}
- instanceof:
在嘗試轉(zhuǎn)換之前確保該對(duì)象是另一個(gè)對(duì)象的實(shí)例,可以利用運(yùn)算符 instanceof來實(shí)現(xiàn)春畔。
警告 : 對(duì)象成員訪問運(yùn)算符 ( . ) 優(yōu)先于類型轉(zhuǎn)換運(yùn)算符 。 使用圓括號(hào)保證在點(diǎn)運(yùn)算符 ( ? )
之前進(jìn)行轉(zhuǎn)換 岛都, 例如 :( ( Circle) object ) . getArea();
7.Object 類的 equals 方法
Object類中方法的默認(rèn)實(shí)現(xiàn):
//這個(gè)實(shí)現(xiàn)使用 == 運(yùn)算符檢測(cè)兩個(gè)引用變量是否指向同一個(gè)對(duì)象律姨。
//因此 , 應(yīng)該在自己的客戶類中重寫這個(gè)方法 臼疫, 以測(cè)試兩個(gè)不同的對(duì)象是否具有相同的內(nèi)容 择份。
public boolean equals ( Object o ){
return(this==obj);
}
調(diào)用語法:object1. equals ( object2 ) ;