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