"世界万物皆有接口",今天看到这句话瞬间感觉在没接触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的一个实例(对象)
解决问题: 避免类型转换异常