"世界萬物皆有接口",今天看到這句話瞬間感覺在沒接觸IT之前的世界觀有問題,哈哈
今天介紹一個用到了繼承,接口,多態的綜合例題,思路不難,綜合性比較強,適合新手練習用.
考覈知識點
繼承
接口
類實現接口
多態(向上轉型)
向下轉型
例題描述
請使用代碼描述:
奧迪車(Audi)都具有跑的功能,但是智能奧迪車(SmartAudi)除了具有跑的功能外,還具有自動泊車(automaticParking)和無人駕駛(automaticDrive)的功能!
要求:在測試類中創建Audi車對象和智能奧迪車對象,分別調用各自方法; 然後測試向上轉型(轉換爲父類類型和實現的接口類型)和向下轉型.
代碼描述
請使用代碼描述:
奧迪車(Audi)都具有跑的功能,但是智能奧迪車(SmartAudi)除了具有跑的功能外,還具有自動泊車(automaticParking)和無人駕駛(automaticDrive)的功能!
要求:在測試類中創建Audi車對象和智能奧迪車對象,分別調用各自方法; 然後測試向上轉型(轉換爲父類類型和實現的接口類型)和向下轉型.
操作步驟描述
定義奧迪車類(Audi)
成員方法: 跑(run())
輸出格式: 奧迪車在跑
定義智能接口(Smart)
抽象方法: 自動泊車(automaticParking)和無人駕駛(automaticDrive)
定義智能奧迪車類(SmartAudi) 繼承Audi實現Smart接口
成員方法
實現automaticParking方法
輸出:智能奧迪車在自動泊車
實現automaticDrive方法
輸出:智能奧迪車在無人駕駛
定義測試類Test
提供main方法
在main方法中
創建Audi車對象 a,調用跑方法
創建SmartAudi車對象 sa,調用跑,自動泊車,自動駕駛方法
定義Audi類型的變量 aa 把sa賦值aa; 測試aa只能調用run方法,不能調用其他方法
判斷如果aa是SmartAudi的實例對象, 把aa強制轉換爲saa;使用saa調用自動泊車和自動駕駛方法
定義Smart類型的變量 s,把sa賦值給s,測試只能調用自動泊車和自動駕駛方法,不能調用run方法.
/*
定義奧迪車類(Audi)
成員方法: 跑(run())
輸出格式: 奧迪車在跑
*/
publicclass Audi {
// 成員方法: 跑(run())
// 輸出格式: 奧迪車在跑
publicvoid run(){
System.out.println("奧迪車在跑");
}
}
/*
定義智能接口(Smart)
抽象方法: 自動泊車(automaticParking)和無人駕駛(automaticDrive)
*/
publicinterface Smart {
// 自動泊車(automaticParking)
publicabstractvoid automaticParking();
// 無人駕駛(automaticDrive)
publicabstractvoid automaticDrive();
}
/*
定義智能奧迪車類(SmartAudi) 繼承Audi實現Smart接口
成員方法
實現automaticParking方法
輸出:智能奧迪車在自動泊車
實現automaticDrive方法
輸出:智能奧迪車在無人駕駛
*/
publicclass SmartAudi extends Audi implements Smart {
// 實現automaticParking方法
publicvoid automaticParking() {
System.out.println("智能奧迪車在自動泊車");
}
// 實現automaticDrive方法
publicvoid automaticDrive() {
System.out.println("智能奧迪車在自動駕駛");
}
}
/*
定義測試類Test
提供main方法
在main方法中
創建Audi車對象 a,調用跑方法
創建SmartAudi車對象sa,調用跑,自動泊車,自動駕駛方法
定義Audi類型的變量aa 把sa賦值aa; 測試aa只能調用run方法,不能調用其他方法
判斷如果aa是SmartAudi的實例對象, 把aa強制轉換爲saa;使用saa調用自動泊車和自動駕駛方法
定義Smart類型的變量 s,把sa賦值給s,測試只能調用自動泊車和自動駕駛方法,不能調用run方法.
*/
publicclass Test {
publicstaticvoid main(String[] args) {
// 創建Audi車對象 a,調用跑方法
Audi a = new Audi();
a.run();
// 創建SmartAudi車對象sa,調用跑,自動泊車,自動駕駛方法
SmartAudi sa = new SmartAudi();
sa.run();
sa.automaticParking();
sa.automaticDrive();
// 定義Audi類型的變量aa 把sa賦值aa; 測試aa只能調用run方法,不能調用其他方法
Audi aa = sa;
aa.run();
// aa.automaticParking();編譯報錯
// aa.automaticDrive(); 編譯報錯
// 判斷如果aa是SmartAudi的實例對象, 把aa強制轉換爲saa;使用saa調用自動泊車和自動駕駛方法
if(aainstanceof SmartAudi){
SmartAudi saa = (SmartAudi) aa;
saa.automaticParking();
saa.automaticDrive();
}
// 定義Smart類型的變量 s,把sa賦值給s,測試只能調用自動泊車和自動駕駛方法,不能調用run方法.
Smart s = sa;
s.automaticDrive();
s.automaticParking();
// s.run();編譯報錯
}
}
==========================================\
這裏面提到了向上轉型和向下轉型,介紹一下這兩種類轉型的格式和一些注意事項
java中類的轉型可以分成兩種:
1. 向上轉型, 格式: 父類類型 變量名 = 子類對象;
或者: 接口類型 變量名 = 實現類對象;
2. 向下轉型,格式: 子類類型 變量名 = (子類類型)父類變量名;
如果避免類型轉換異常呢?
需要使用到關鍵字:instanceof
使用格式:
boolean b = 對象A instanceof 類A;
解釋: 判斷對象A是否是類A的一個實例(對象)
解決問題: 避免類型轉換異常