多態

多態

可以理解爲一個事物的多種形態,也就是說一個子類對象既可以給子類成員賦值,也可以給父類的成員賦值。

多態的最終體現爲父類的引用變量指向子類對象。

多態的前提是必須有子父類關係或者是實現接口的關係,否二無法完成多態。

在創建多態的父類引用變量調用方法時,運行的是子類重寫後的方法。Person p = new Student();p.show();該方法調用的是子類重寫後的方法

多態的定義格式

定義多態對象的格式:

類的定義:父類類型 對象名 = new 子類對象();

                  對象名.方法();//調用後必須是子類重寫後的方法

抽象類的定義:抽象類父類類型 對象名 = new 子類對象();

                            對象名.方法();//調用後必須是子類重寫後的方法

接口的定義格式:接口類型 對象名 = new 實現類對象();

                          對象名.方法();//調用後必須是子類重寫後的方法

多態中成員的特點

多態中成員變量的特點:

編譯時,看父類中有沒有這個變量,如果有,編譯成功,沒有,編譯失敗

運行時,運行的是父類中的變量

簡言之,編譯運行都父類

多態中成員方法的特點:

編譯時,看父類中有沒有這個方法,如果有,編譯成功,沒有,編譯失敗

運行時,運行的是子類中重寫後的方法。

簡言之,編譯看走邊,運行看右邊

instanceof關鍵字

該關鍵字的作用:用於引用數據類型的比較判斷,創建一個多態對象,比較這個對象是不是子類對象,比如:Person p = new Student();判斷這個p是不是Student對象,如果是,返回true,不是返回false,格式如下:

//創建子類的多態對象

Person p = new Student();

//判斷這個P是不是Student

boolean b = p instanceof Student;

結果返回的是true

boolean b = p instanceof Teacher;

運行返回的是false

多態的轉型

多態和基本數據類型一樣,都需要數據的轉型,但稍有區別。

向上轉型(自動提升):這種情況不需要我們自己操作,它會自動進行轉型,比如

Person p = new Student();

p.sleep();

他會自動轉型,這種的缺點在於,只能調用他們的公共方法,子類特有的方法不能調用,這時就需要對該類型進行向下轉型

向下轉型(強制轉換):

Person p = new Student();

Student s = (Student)p;

s.study();

這樣就可以調用子類特有的學習方法了。

多態轉型的案例

l  動物類

package cn.itcast.duotai;
/*
 * 定義一個抽象的動物類
 * 定義一個抽象的吃的方法
 */
public abstract class Animal {
   //定義一個抽象的吃的方法
   public abstract void eat();
}


l  貓類

package cn.itcast.duotai;
/*
 * 定義貓的類繼承動物類
 * 重寫父類吃的方法
 * 定義貓特有的方法
 */
public class Cat extends Animal{
   //重寫父類吃的方法
   public void eat(){
      System.out.println("貓吃貓糧");
   }
   //定義貓特有的方法
   public void catchMice(){
      System.out.println("貓會抓老鼠");
   }
}


l  狗類

package cn.itcast.duotai;
/*
 * 定義狗的類繼承動物類
 * 重寫動物類吃的方法
 * 定義狗特有的方法
 */
public class Dog extends Animal{
   //重寫動物類吃的方法
   public void eat(){
      System.out.println("狗吃狗糧");
   }
   //定義狗特有的方法
   public void lookHome(){
      System.out.println("狗會看家");
   }
}


l  測試類

package cn.itcast.duotai;
/*
 * 測試類
 * 創建貓,狗的多態對象,調用他們特有的方法
 * 將對象進行強制轉換,調用貓,狗特有的方法
 */
public class Test {
   public static void main(String[] args) {
      //創建貓,狗的多態對象,調用他們特有的方法
      Animal a1 = new Cat();
      Animal a2 = new Dog();
      a1.eat();
      a2.eat();
      //將對象進行強制轉換,調用貓,狗特有的方法
      Cat c = (Cat)a1;
      c.catchMice();
      Dog d = (Dog)a2;
      d.lookHome();
   }
}


案例

電腦的功能是開機,關機功能,它有USB接口,可以接入許多的外接設備,比如鍵盤,鼠標,將這個事物在代碼中體現出來:

l  電腦類

package cn.itcast.computerDemo;
/*
 * 定義電腦類
 * 功能:打開電腦,關閉電腦,調用USB的功能
 */
public class Computer {
   //打開電腦
   public void openComputer(){
      System.out.println("開啓電腦");
   }
   //關閉電腦
   public void closeComputer(){
      System.out.println("關閉電腦");
   }
   //調用USB的功能
   public void useUSB(USB usb){
      usb.open();
      usb.close();
   }
}


l  USB接口類

package cn.itcast.computerDemo;
/*
 * 定義usb接口
 * 抽象概念,打開,關閉
 */
public interface USB {
   public abstract void open();
   public abstract void close();
}


l  鼠標類

package cn.itcast.computerDemo;
/*
 * 定義鼠標類實現接口
 * 重寫接口功能
 */
public class Mouse implements USB{
   public void open(){
      System.out.println("打開鼠標");
   }
   public void close(){
      System.out.println("關閉鼠標");
   }
}


l  鍵盤類

package cn.itcast.computerDemo;
/*
 * 定義鍵盤類實現接口類
 * 重寫接口中的方法
 */
public class keyBoard implements USB{
   //重寫接口中的方法
   public void open(){
      System.out.println("打開鍵盤");
   }
   public void close(){
      System.out.println("關閉鍵盤");
   }
}


l  測試類

package cn.itcast.computerDemo;
/*
 * 測試類
 */
public class Test {
   public static void main(String[] args) {
      //創建電腦的對象
      Computer c = new Computer();
      c.openComputer();
      //調用鼠標的功能
      c.useUSB(new Mouse());
      //調用鍵盤的功能
      c.useUSB(new keyBoard());
      c.closeComputer();
   }
}


 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章