1. 程式人生 > 實用技巧 >2020年8月13日 多型 及應用:多型陣列、多型引數

2020年8月13日 多型 及應用:多型陣列、多型引數

  

/*
 * 一、面向物件的基本特徵:
 * 1、封裝
 *     和許可權修飾符有關    
 * 2、繼承
 *     extends
 * 3、多型
 *     
 * 二、多型
 * 多型:多種形態
 * 
 * 變數的引用形式:
 * (1)本態引用:左邊的變數與右邊的物件是同一種類型
 * (2)多型引用:左邊的變數是父類型別,右邊的物件是子類的物件
 * 
 * 多型的表現出來的特徵:編譯型別與執行時型別不一致
 *     編譯的時候,按照父類的型別進行編譯的
 *     執行的方法,按照子類進行執行,是“執行子類重寫的方法”
 *     
 *     編譯看左邊,執行看右邊
 * 
 * 前提:(1)繼承(2)重寫(3)多型引用
* 用途:方法的動態繫結 * 強調:多型和屬性無關,只說方法 * * 網上也有人這麼說,把過載也歸為多型,我們不這麼認為 * */
package com.atguigu.test02.polymorphism;

public class TestPolymorphism {
    public static void main(String[] args) {
        //1、本態引用
//        Person p = new Person();
//        Woman w = new Woman();
//        Man m = new Man();
        
        
//2、多型引用 Person p2 = new Woman(); Person p3 = new Man(); p2.eat(); p2.walk(); // p2.shop(); System.out.println(p2.info);//屬性沒有多型,只看編譯時型別 } } class Person{ String info = "atguigu"; public void eat(){ System.out.println("吃飯"); }
public void walk(){ System.out.println("走路"); } } class Woman extends Person{ String info = "尚矽谷"; public void eat(){ System.out.println("細嚼慢嚥的吃飯"); } public void walk(){ System.out.println("婀娜多姿走路"); } public void shop(){ System.out.println("買買買..."); } } class Man extends Person{ public void eat(){ System.out.println("狼吞虎嚥的吃飯"); } public void walk(){ System.out.println("大搖大擺的走路"); } public void smoke(){ System.out.println("吞雲吐霧"); } }

/*
* 多型的好處:
* 使得程式設計師編寫程式碼更靈活
* 多型的應用:
* (1)多型陣列:
* 陣列的元素是父類的型別,實際儲存的是子類的物件
* 用這樣的陣列,就可以統一管理,所有子類的物件
*/

package com.atguigu.test02.polymorphism;


public class TestUse1 {
    public static void main(String[] args) {
        /*
         * 建立一個數組,可以儲存各種圖形的物件,包括圓物件,矩形物件,三角形物件...
         */
        //本態陣列
        //Circle[] yuans = new Circle[3];//這個陣列存圓
        //Rectangle[] jus = new Rectangle[3];//這個陣列存矩形
        
        Graphic[] all = new Graphic[3];//這個陣列就可以儲存各種圖形的物件
        //左邊的元素arr[0]是Graphic型別,右邊是子類圓物件
        all[0] = new Circle(1.2);
        
        //左邊的g2是Graphic,右邊的是矩形物件
        Graphic g2 = new Rectangle(2, 4);
        all[1] = g2;
        
        all[2] = new Circle(4.2);
        
        //遍歷所有圖形的面積
        for (int i = 0; i < all.length; i++) {
            //執行哪個getArea()方法,要看all[i]中儲存的是哪個子類的物件
            System.out.println("面積:" + all[i].getArea());
        }
    }
}
//Graphic圖形
class Graphic{
    public double getArea(){
        return 0.0;//這句話沒有什麼意義,只是為了保證語法
    }
}
class Circle extends Graphic{
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }
    //重寫
    public double getArea(){
        return 3.14 * radius * radius;
    }
}
class Rectangle extends Graphic{
    private double length;
    private double width;
    public Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }
    //重寫
    public double getArea(){
        return length * width;
    }
}

/*
* 多型的應用:
* (2)多型引數:
* 形參是父類的型別,實參是子類的物件
*/

package com.atguigu.test02.polymorphism;


public class TestUse2 {
    //這個方法,能夠檢查所有的動物吃東西是否正常
    //沒有多型的話,需要過載很多個
    /*public static void check(Dog dog ){
        dog.eat();
    }
    public static void check(Cat cat ){
        cat.eat();
    }*/
    
    public static void check(Animal a){
        a.eat();
    }
    
    public static void main(String[] args) {
        //匿名物件
        check(new Dog());//隱含了,形參Animal a = 實參  new Dog()
        check(new Cat());//隱含了,形參Animal a = 實參  new Cat()
        
        Dog d = new Dog();
        check(d);//有名物件
    }
}
class Animal{
    public void eat(){
        System.out.println("吃東西");
    }
}
class Dog extends Animal{
    public void eat(){
        System.out.println("啃骨頭");
    }
}
class Cat extends Animal{
    public void eat(){
        System.out.println("吃魚");
    }
}