2020年8月13日 多型 及應用:多型陣列、多型引數
阿新 • • 發佈:2020-08-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("吃魚"); } }