從零開始學Java之多態 向上轉型與向下轉型

一、什麼是多態?


舉例說明如下:


public class Animal{
//成員
public void eat(){
System.out.println("動物在吃!");
   }
}


public class Cat extends Animal{


//重寫
public void eat(){
System.out.println("貓吃魚");
}
//Cat特有的方法.
public void move(){
System.out.println("貓走貓步!");
 }
}







public class Dog extends Animal{


//重寫
public void eat(){
System.out.println("狗啃骨頭!");
   }
}


public class Test{
public static void main(String[] args){
//向上轉型又被稱作:自動類型轉換.
//父類型的引用指向子類型對象.
//程序分兩個階段:編譯階段,運行階段。
//程序編譯階段只知道a1是一個Animal類型。
//程序在運行的時候堆中的實際對象是Cat類型。
Animal a1 = new Cat();
//程序在編譯階段a1被編譯器看做Animal類型.
//所以程序在編譯階段a1引用綁定的是Animal類中的eat方法.(靜態綁定)
//程序在運行的時候堆中的對象實際上是Cat類型,而Cat已經重寫了eat方法。
//所以程序在運行階段對象的綁定的方法是Cat中的eat方法.(動態綁定)
a1.eat(); //貓吃魚
//向下轉型:強制類型轉換
Animal a2 = new Cat(); //向上轉型.
//要執行move方法,怎麼做?
//只能強制類型轉換,需要加強制類型轉換符
Cat c1 = (Cat)a2;
c1.move();
//判斷以下程序運行的時候會出什麼問題?
//Animal a3 = new Dog(); //向上轉型.
//強制類型轉換
//Cat c2 = (Cat)a3; //會拋出異常: java.lang.ClassCastException
//在做強制類型轉換的時候程序是存在風險的!
//爲了避免ClassCastException的發生,java引入了 instanceof
用法:
1. instanceof運算符的運算結果是 boolean類型 
2. (引用 instanceof 類型) --> true/false
例如:(a instanceof Cat) 如果結果是true表示:a引用指向堆中的java對象是Cat類型.
Animal a3 = new Dog();
System.out.println(a3 instanceof Cat); //結果是:false
//推薦:在做向下轉型的時候要使用instanceof運算符判斷,避免ClassCastException
if(a3 instanceof Cat){
Cat c2 = (Cat)a3;
   }
  }
}





關於java語言中向上轉型和向下轉型
1.向上轉型(upcasting) :  子--->父
2.向下轉型(downcasting) :  父--->子
注意:無論是向上轉型還是向下轉型,兩個類之間必須要有繼承關係。


public class Test{
public static void main(String[] args){
//向上轉型又被稱作:自動類型轉換.
//父類型的引用指向子類型對象.
//程序分兩個階段:編譯階段,運行階段。
//程序編譯階段只知道a1是一個Animal類型。
//程序在運行的時候堆中的實際對象是Cat類型。
Animal a1 = new Cat();
//程序在編譯階段a1被編譯器看做Animal類型.
//所以程序在編譯階段a1引用綁定的是Animal類中的eat方法.(靜態綁定)
//程序在運行的時候堆中的對象實際上是Cat類型,而Cat已經重寫了eat方法。
//所以程序在運行階段對象的綁定的方法是Cat中的eat方法.(動態綁定)
a1.eat(); //貓吃魚
//向下轉型:強制類型轉換
Animal a2 = new Cat(); //向上轉型.
//要執行move方法,怎麼做?
//只能強制類型轉換,需要加強制類型轉換符
Cat c1 = (Cat)a2;
c1.move();
//判斷以下程序運行的時候會出什麼問題?
//Animal a3 = new Dog(); //向上轉型.
//強制類型轉換
//Cat c2 = (Cat)a3; //會拋出異常: java.lang.ClassCastException
//在做強制類型轉換的時候程序是存在風險的!
//爲了避免ClassCastException的發生,java引入了 instanceof
用法:
1. instanceof運算符的運算結果是 boolean類型 
2. (引用 instanceof 類型) --> true/false
例如:(a instanceof Cat) 如果結果是true表示:a引用指向堆中的java對象是Cat類型.
Animal a3 = new Dog();
System.out.println(a3 instanceof Cat); //結果是:false
//推薦:在做向下轉型的時候要使用instanceof運算符判斷,避免ClassCastException
if(a3 instanceof Cat){
Cat c2 = (Cat)a3;
}
}
}




二、多態的好處


1.使用多態可以使代碼之間的耦合度降低。
2.項目的擴展能力增強。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章