1. 程式人生 > >Java面向對象-對象的多態性

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

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面向對象-對象的多態性