Java基礎入門之多態(tài)和對象類型轉換
一、多態(tài)
1.假設實現(xiàn)一個動物發(fā)出的叫聲方法,我們知道不同的動物,它們的叫聲是不一樣的。當在方法中傳入一個參數(shù)類型,例如貓的叫聲、狗的叫聲。在同一個方法,當參數(shù)不同它們的執(zhí)行結果各不相同,這就是多態(tài)。
2.多態(tài)是把子類對象賦給父類引用時,調用重寫的方法時,表示的是子類的行為。
3.怎么實現(xiàn)多態(tài)例子
- //定義接口Fruit
- interface Fruit{
- void info();//定義抽象方法info()
- }
- //定義Cherry類實現(xiàn)Fruit接口
- class Cherry implements Fruit{
- double weight=66;//weight屬性為重量
- //實現(xiàn)info()方法
- public void info(){
- System.out.println("我是一個櫻桃!"+"重量為:"+weight+"g");
- }
- }
- //定義Apple類實現(xiàn)Fruit接口
- class Apple implements Fruit{
- double weight=250;//weight屬性為重量
- //實現(xiàn)info()方法
- public void info(){
- System.out.println("我是一個蘋果!"+"重量為:"+weight+"g");
- }
- }
- public class p30 {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- Fruit f1=new Cherry();//創(chuàng)建Cherry對象,F(xiàn)ruit類型變量f1引用
- Fruit f2=new Apple();//創(chuàng)建Apple對象,F(xiàn)ruit類型變量f2引用
- fruitInfo(f1);//調用fruitInfo()方法,把f1參數(shù)傳入
- fruitInfo(f2);//調用fruitInfo()方法,把f2參數(shù)傳入
- }
- //定義靜態(tài)的fruitInfo()方法,接受一個Fruit的參數(shù)f
- public static void fruitInfo(Fruit f){
- f.info();
- }
- }
運行的結果是:
- 我是一個櫻桃!重量為:66.0g
- 我是一個蘋果!重量為:250.0g
我是一個櫻桃!重量為:66.0g我是一個蘋果!重量為:250.0g
從上面代碼中,定義了一個Fruit接口,定義了抽象方法info()。定義Cherry類和Apple類實現(xiàn)Fruit接口,定義變量weight屬性和實現(xiàn)info()方法。“Fruit f1=new Cherry()、Fruit f2=new Apple()”實現(xiàn)子類對象賦給父類引用,調用fruitInfo()方法,父類引用了兩個子類對象分別傳入f1和f2參數(shù)。
二、對象類型轉換
1.子類對象是可以自動轉換成父類。
2.父類轉換成子類對象就需要強制轉換。
例如:
- //定義接口Fruit
- interface Fruit{
- void info();//定義抽象方法info()
- }
- //定義Cherry類實現(xiàn)Fruit接口
- class Cherry implements Fruit{
- double weight=66;//weight屬性為重量
- //實現(xiàn)info()方法
- public void info(){
- System.out.println("我是一個櫻桃!"+"重量為:"+weight+"g");
- }
- //定義pro()方法
- void pro(){
- System.out.println("產地:浙江");
- }
- }
- public class p31 {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- Fruit f1=new Cherry();//創(chuàng)建Cherry類的實例對象
- fruitInfo(f1);//調用fruitInfo()方法,把f1參數(shù)傳入
- }
- //定義靜態(tài)方法fruitInfo(),接受一個Fruit參數(shù)f
- public static void fruitInfo(Fruit f){
- f.info();//調用傳入?yún)?shù)f的info()方法
- f.pro();//調用傳入?yún)?shù)f的pro()方法
- }
- }
運行的結果是:
從上面可以看出編譯出錯了,調用fruitInfo()方法傳入Cherry對象,方法參數(shù)是Fruit類型的,把Cherry的子類當作父類使用導致程序編譯出現(xiàn)錯誤,程序在運行到f.pro()這行代碼發(fā)現(xiàn)這個方法沒有定義。因為傳入的是Cherry類,在Cherry類中定義了pro()方法需要強制轉換才可以運行,就是把Fruit類型變量強制轉換成Cherry類型。
修改后代碼如下所示:
- //定義靜態(tài)方法fruitInfo(),接受一個Fruit參數(shù)f
- public static void fruitInfo(Fruit f){
- Cherry f1=(Cherry)f;
- f1.info();//調用傳入?yún)?shù)f的info()方法
- f1.pro();//調用傳入?yún)?shù)f的pro()方法
- }
再次運行的結果是:
- 我是一個櫻桃!重量為:66.0g
- 產地:浙江
三、instanceof關鍵字
1.instanceof關鍵字作用
判斷一個實例對象是否屬于一個類,它的語法如下:
- 對象 instanceof 類
2.在進行引用類型轉換前先使用instanceof關鍵字判斷,例如:
- if( f instanceof Cherry){ //如果f指的是Cherry對象類型時,返回的是true。
- Cherry f1=(Cherry)f;
- }
四、總結
本文主要介紹了多態(tài)、對象類型轉換、instanceof關鍵字。
多態(tài)是子類對象賦給父類引用時,調用重寫的方法時,表示的是子類的行為。通過怎么實現(xiàn)多態(tài)例子幫助理解這個用法。
對象類型轉換是子類對象是可以自動轉換成父類、父類轉換成子類對象就需要強制轉換。
instanceof關鍵字用來判斷一個實例對象是否屬于一個類,希望大家通過本文的學習,對你有所幫助!