詳解Java的繼承
繼承:
把多個類相同的內容提取到另外一個類中,然後使用關鍵字extends來實現繼承
繼承的好處:
1.提高瞭代碼的復用性
2.提高瞭代碼的維護性 隻需要修改父類的內容
3.讓類與類之間產生瞭繼承關系,為瞭後面的多態做鋪墊,要有繼承才能做多態
繼承的壞處:
1.類的耦合性增強瞭,一個父類改變瞭,子類也跟著改變
2.隻可以單個繼承,不可以多個繼承,可以多層繼承,子繼承父,父繼承爺爺
//可以多層繼承 class GrandFather{ } class Father extends GrandFather{ } class Son extends Father{ } //不可以多個繼承,比如 class Son extends Father,Mother{ }
繼承的特點:
1.要想初始化子類 必須先初始化父類 ,先有父親 才能有兒子
2.子類隻能繼承父類的非私有的成員,
可以通過下面的案例的代碼和註釋來理解
class Father2{ int num = 20; Father2(){ System.out.println("這是父親的無參構造方法"); } private void fun1(){ System.out.println(num); } } class Son2 extends Father2 { public void fun2() { System.out.println(num); // System.out.println(num2); // 子類不能繼承父類的私有成員變量 } } public class ExtendsDemo2 { public static void main(String[] args) { Son2 son2 = new Son2(); son2.fun2();//父親的構造方法也執行瞭,要想初始化子類,必須先初始化父類 //運行結果:這是父親的無參構造方法,20 //son2.fun1(); //不可以訪問父類的私有成員方法 } }
3.子類不能繼承父類的構造方法,構造方法是屬於該類本身的,但是可以通過super關鍵字訪問父類的構造方法,因為要想初始化子類,必須先初始化父類,是通過構造方法進行初始化的
4.不要為瞭部分功能而使用繼承,當兩個類語法滿足什麼是什麼,可以用繼承,比如狗、貓、老虎都是動物。
繼承和成員變量之間的關系:
a.當子類的成員變量和父類中的成員變量名字一樣時,
查找:1.先在方法的局部范圍內進行查找,如果找到就返回
2.如果在方法局部范圍找不到,去本類成員位置(成員變量)上查找,如果找到就返回
3.如果在成員位置上也找不到,去父類成員位置中查找,如果找到就返回
4.如果在父類成員位置找不到,報錯
b.當子類的成員變量和父類的成員變量名字不一樣:名字是誰就訪問誰
this關鍵字和super關鍵字的區別
區別:this代表的是調用該類的當前對象 ,super代表的是父類存儲空間的標識(父類的引用,可以操作父類的成員)
使用方法:
1.訪問成員變量 this.成員變量訪問的是本類中的成員變量,super.成員變量訪問的是父類中的成員變量
//用this和super關鍵字訪問本類和父類中的成員變量 class Father3{ int num= 10; } class Son3 extends Father3{ int num = 20; public void show(){ int num= 30; System.out.println(num); System.out.println(this.num); System.out.println(super.num); } } public class ExtendsDemo3 { public static void main(String[] args) { Son3 son3 = new Son3(); son3.show(); } }
2.訪問構造方法
要想初始化子類,必選先初始化父類 ,因為子類會繼承父類的數據,甚至可能會使用父類的
數據,所以在子類初始化之前,一定會先完成父類的初始化
註意: 每個子類的構造方法的第一句話默認是super()
//這個案例執行出,會先訪問父類的無參構造方法,再訪問子類的帶參構造方法 class Father8 { int age; Father8() { System.out.println("父類中的無參構造方法"); } Father8(String s) { System.out.println("這是父類帶參數的構造方法" + s); } } class Son8 extends Father8 { Son8() { System.out.println("子類的無參構造方法"); } Son8(String s) { System.out.println("子類帶參數的構造方法" + s); } } public class ExtendsDemo7 { public static void main(String[] args) { Son8 s1 = new Son8("小王"); } }
上面這個案例執行結果,會先訪問父類的無參構造方法,再訪問子類的帶參構造方法,因為在子類的無參構造方法裡面有一個隱藏super();,會指引我們先訪問父類的無參構造方法,如果我們要訪問父類的帶參構造方法,我們需要手寫一個super(參數);來指引訪問父類的帶參構造方法。
3.訪問成員方法:this.成員方法(),super.成員方法()
1、當子類的成員方法名與父類成員方法名不一樣的時候,該調用誰就調用誰的
2、當子類的成員方法名與父類成員方法名一樣的時候,怎麼辦呢?(就近原則)
1)現在本類中查找,如果有就調用,如果沒有去父類中查找,
2)如果父類中有方法,就調用父類的
3)如果連父類中都沒有要調用的方法名,報錯,提示找不到方法。
方法的重寫:
如果子類的方法聲明和父類的方法聲明一樣,這樣的現象叫方法的重寫,重寫現象是發生在繼承的關系中的,子類和父類的方法聲明一樣,但是實現的結果不一樣。比如:我在父類中書寫一個study方法,輸出“學習java”,在子類中也書寫一個聲明一樣的study方法,輸出“學習高等數學”,在這裡雖然父類和子類的聲明一樣,但是我們最終的實現不一樣,這就叫方法的重寫。
總結
到此這篇關於詳解Java的繼承的文章就介紹到這瞭,更多相關Java繼承內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!