java多态和继承_Java学习--继承与多态
1.何時使用繼承
1.1符合 *** is a ***的規則,即雙方可以相互依存,亦可保持獨立;
1.2可實現代碼復用
即當大家的代碼塊具有相似或類似時,我們可以抽象出一些公共的屬性及方法作為父類,子類可以 繼承父類而使用這些代碼片段。同時也能保持自己的獨立性。
2.抽象
2.1定義:
在一段段的繼承關系中,可以清晰地形成一座金字塔格式,底部的子類將會越來越強大,因為其繼承了上部的多種屬性及方法,而越在上部的類就越簡單也即越抽象。甚至可追溯到這個父類中的方法無法滿足子類,形成了一種抽象方法,含有這種抽象方法的類即為抽象類。
語法如下:
public abstract class 類名 {
}
2.2抽象的特性
抽象類由于過于抽象,將無法實現方法,也即實現也無意義,固抽象類不能實例化。
public abstract class Animal{
private String name;
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public Animal(){
}
public Animal(String name){
this.name = name;
}
public void sleep(){
}
}
如果一個方法過于抽象,不能實現,其一定要寫在抽象類中,不加方法體,固:
抽象方法一定位于抽象類中;
抽象方法沒有方法體;
不過,抽象類中的方法不一定都是抽象方法。
注意:
如果子類繼承了抽象類,需對抽象方法做出修改,否則,此子類也必須是抽象子類。
3.final關鍵字
——final是java語言中的一個關鍵字,被譯為最終的不可改變的
——final修飾的類無法被繼承
——final修飾的方法無法被重寫
——final修飾的變量一旦被賦值,將不可再次賦值
——final修飾的引用一旦指向某個對象之后,就不能再指向其他對象,所以被final修飾后的引用指向的對象將不會被垃圾回收機制回收。但該對象中的內存可以被修改,因為其修飾的引用是一個地址,地址不能被改變,但其對象中的內容可以改變。
——final修飾的實例變量常常與static一起使用,被稱為常量,與static一起使用將有效提高運行效率。
public final class Animal{
}
public class Person extends Animal{
public void sleep(){
System.out.println("閉眼躺著睡覺...");
}
}
3.1思考
靜態方法能被繼承嗎?
靜態方法能被重寫嗎?
靜態方法可以被繼承,應該說是被默認繼承了靜態方法,但不能重寫,應該說該靜態方法被隱藏了。
分析:
1. 靜態方法和屬性是屬于類的,調用的時候直接通過類名.方法名完成,不需要繼承機制及可以調用。如果子類里面定義了靜態方法和屬性,那么這時候父類的靜態方法或屬性稱之為"隱藏"。如果你想要調用父類的靜態方法和屬性,直接通過父類名.方法或變量名完成,至于是否繼承一說,子類是有繼承靜態方法和屬性,但是跟實例方法和屬性不太一樣,存在"隱藏"的這種情況。
2. 多態之所以能夠實現依賴于繼承、接口和重寫、重載(繼承和重寫最為關鍵)。有了繼承和重寫就可以實現父類的引用指向不同子類的對象。重寫的功能是:"重寫"后子類的優先級要高于父類的優先級,但是“隱藏”是沒有這個優先級之分的。
3. 靜態屬性、靜態方法和非靜態的屬性都可以被繼承和隱藏而不能被重寫,因此不能實現多態,不能實現父類的引用可以指向不同子類的對象。非靜態方法可以被繼承和重寫,因此可以實現多態。
4.多態
4.1定義:
多態是同一個行為具有多個不同表現形式或形態的能力。多態就是同一個接口,使用不同的實例而執行不同操作。對拓展開放,對修改關閉。
4.2使用多態的好處:
1.消除類型之間的耦合關系
2. 可替換性
3. 可擴充性
4. 接口性
5. 靈活性
6. 簡化性
4.3實現步驟:
[1] 編寫父類
[2] 編寫子類,子類一定要重寫/實現父類的方法
[3] 運行時,父類類型 引用 子類對象 (Pet pet = new Dog())
當使用多態方式調用方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;如果有,再去調用子類的同名方法。可以使程序有良好的擴展,并可以對所有類的對象進行通用處理。
4.4多態的實現形式
1.父類類型 引用 子類對象(基于此而延伸)
實例:
// 多態// 同一引用類型Pet pet = null;
// 父類引用 引用 子類對象pet = new Dog("二狗",100,0,"土狗");
// 呈現多態pet.eat();
這里的.eat()的方法,是屬于Dog子類中獨有的方法,父類將子類的方法引用了過來,完成多態,實現拓展性。
2.父類作為方法的形參實現多態
實例:
public void feed(Pet pet) {
System.out.println(this.getName() + "正在喂" + pet.getName());
pet.eat();
}
Pet作為寵物類的父類,在主人類中被當作了方法的形參,實現了多態。
3.父類作為方法的返回值實現多態
實例:
public Pet adoptPet(int type) {
Pet pet = null;
if(1 == type) {
pet = new Dog();
}else if(2 == type) {
pet = new Penguin();
}else if(3 == type){
pet = new Cat();
}
return pet;
}
4.5存在于多態中的類型轉換
在多態實現的過程中一樣存在這兩種類型轉換,即自動類型轉換(亦稱為向上類型轉換)與強制類型轉換(向下類型轉換)。
自動類型轉換:子類可以自動轉換為父類。
Pet pet = null;
pet = new Dog();
同樣,若想要進行強制類型轉換,需要加強制類型轉換符。
子類類型 引用 = (子類)父類對象
需要注意的是,如果單純這樣轉換,編譯不會報錯,但在運行過程中將很容易發生運行錯誤,許多程序員在編碼的過程中,很容易將子類類型轉換為錯誤的父類類型,導致父類在調用子類特有的方法時發生找不到方法的可能。所以java為了應對這些問題,創建了 instantceof關鍵字。
通過instantceof關鍵字可以判斷其轉換的類型是否是我們需要的類型,可參考以下格式:
public class TestInstanceOf {
public static void main(String[] args) {
Dog dog = new Dog();
System.out.println(dog instanceof Dog); //trueSystem.out.println(dog instanceof Pet); //trueSystem.out.println(dog instanceof Object); //true}
}
public void play(Pet pet) {
if(pet instanceof Dog) {
Dog dog = (Dog) pet;
dog.catchFlyDisc();
}else if(pet instanceof Penguin) {
Penguin penguin = (Penguin) pet;
penguin.swimming();
}
}
總結
以上是生活随笔為你收集整理的java多态和继承_Java学习--继承与多态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql数据传输完整性_mysql –
- 下一篇: 手机的天线去哪了?原来就在眼皮底下