Java面向對象-對象的多態性


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測試類:

 1 package 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 }

運行輸出:

我是學生

我是老師

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM