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