Java面向對象-對象的多態性
阿新 • • 發佈:2017-08-12
log 向下轉型 實現 () each com 動物 spa xtend
Java面向對象-對象的多態性
Java中的多態性表現:
1,方法的重載和重寫;
2,可以用父類的引用指向子類的具體實現,而且可以隨時更換為其他子類的具體實現;
我們先搞個父類Animal:
package com.htli.chap03.sec13; public class Animal { public void say(){ System.out.println("我是一個動物"); } }
再搞兩個子類,分別是Dog和Cat類,重寫父類方法say:
package com.htli.chap03.sec13; public class Cat extends Animal{ public void say(){ System.out.println("我是一個貓"); } }
package com.htli.chap03.sec13; public class Dog extends Animal{ public void say(){ System.out.println("我是一個狗"); } }
然後我們寫個Test測試類:
package com.htli.chap03.sec13; public class Test { public static void main(String[] args) { Dog dog=new Dog(); dog.say(); Cat cat=new Cat(); cat.say(); } }
運行輸出:
我是一個狗
我是一個貓
這個大家肯定能看明白 簡單的子類繼承 以及實例化對象 調用方法 ;
下面我來用多態測試,父類引用指向子類具體實現:
package com.htli.chap03.sec13; public class Test { public static void main(String[] args) { // 父類引用指向Dog子類的具體實現 Animal animal=new Dog(); animal.say(); // 更換實現 animal=new Cat(); animal.say(); } }
運行輸出:
我是一個狗
我是一個貓
對象的轉型:
向上轉型:子類對象->父類對象 安全
向下轉型:父類對象->子類對象 不安全
比如上面的實例:Animal animal=new Dog(); 就是後面的new Dog() 子類對象 向上 Animail animal 轉型 是安全的;
向下轉型 是父類對象強制轉換成子類對象:我們來改下Test類:
package com.htli.chap03.sec13; public class Test { public static void main(String[] args) { // 父類引用指向Dog子類的具體實現 Animal animal=new Dog(); animal.say(); // 向下轉型 Dog dog=(Dog) animal; dog.say(); // 向下轉型 因為animal指向的是Dog具體實現 所以會報錯 Cat cat=(Cat)animal; cat.say(); } }
運行報錯:
我是一個狗
我是一個狗
Exception in thread "main" java.lang.ClassCastException: com.htli.chap03.sec13.Dog cannot be cast to com.htli.chap03.sec13.Cat
at com.htli.chap03.sec13.Test.main(Test.java:15)
轉換異常 所以說向下轉型是不安全的,我們必須知道具體的實現類;
我們上面用的繼承方式演示了多態 其實在實際開發中 更多的是用接口:
我們再寫一個實例:
我們先建一個父類接口People:
package com.htli.chap03.sec13; public interface People { public void say(); }
接下來寫兩個具體實現類,Student Teacher:
package com.htli.chap03.sec13; public class Student implements People{ @Override public void say() { System.out.println("我是學生"); } }
package com.htli.chap03.sec13; public class Teacher implements People{ @Override public void say() { System.out.println("我是老師"); } }
我們來寫一個測試類:
package com.htli.chap03.sec13; public class Test2 { public static void main(String[] args) { People p1=new Student(); p1.say(); p1=new Teacher(); p1.say(); } }
運行輸出:
我是學生
我是老師
Java面向對象-對象的多態性