多态的好处 与 instanceof关键字
多态的好处
好处:
简化代码,提高了扩展性,提高了查询的可维护性
多态的应用:
使用父类作为一个方法的形参,如果一个父类作为参数,那么我们可以传入父类对象,也可以传入对应的子类,这就是多态的常见应用
使用父类作为一个方法的返回值
public class OOPDemo02 { public static void main(String[] args) { Feeder f = new Feeder(); Panda p = new Panda(); Bam b = new Bam(); f.feeder(p,b); Tig t = new Tig(); Meat m = new Meat(); f.feeder(t,m); Animal pig = new Pig(); Food fodder = new Fodder(); f.feeder(pig,fodder); } } /** * 饲养员 */ class Feeder{ //给熊猫喂竹子 // public void feed(Panda p,Bam b){ // p.show(); // b.show(); // } // // //给老虎喂肉 // public void feederT(Tig t,Meat m){ // t.show(); // m.show(); // } public void feeder(Animal a,Food f){ a.show(); f.show(); } } /*** * 动物类 */ class Animal{ public void show(){ System.out.println("无有东西."); } } //熊猫 class Panda extends Animal{ @Override public void show() { System.out.println("熊猫"); } } //老虎 class Tig extends Animal{ @Override public void show() { System.out.println("老虎"); } } //猪 class Pig extends Animal{ @Override public void show() { System.out.println("猪猪"); } } /** * 食物类 */ class Food{ public void show(){ System.out.println("一大堆的食物"); } } //竹子 class Bam extends Food{ @Override public void show() { System.out.println("竹子"); } } //肉 class Meat extends Food{ @Override public void show() { System.out.println("肉"); } } //猪饲料 class Fodder extends Food{ @Override public void show() { System.out.println("猪饲料"); } }
instanceof关键字
在多态中如果我们想要调用子类特有的方法及属性时是实现不了
多态中的类型转换
向上转型(自动转换)I 格式:<父类型><引用变量名>= new<子类型>();
特点:
子类转为父类父类的引用指向子类对象。自动进行类型转换
此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法
此时通过父类引用变量无法调用子类特有的属性和方法
向下转型(强制转换)
格式:<子类型><引用变量名>=(<子类型>)<父类型的引用变量>;
特点: 父类转为子类,父类引用转为子类对象。强制类型转换
在向下转型的过程中,如果没有转换为真实子类类型,会出现类型转换异常
public class OOPDemo02 { public static void main(String[] args) { Animal p = new Panda(); p.show(); Panda a = (Panda) p; a.study(); } } /*** * 动物类 */ class Animal{ public void show(){ System.out.println("不知道吃啥."); } } //熊猫 class Panda extends Animal{ @Override public void show() { System.out.println("熊猫"); } public void study(){ System.out.println("芜湖。。。。。"); } }
类型转换异常
NewDoctor do1 = (NewDoctor) p;
class NewDoctor extends Animal{
@Override
public void show() {
System.out.println("吃饭");
}
}
instanceof关键字
if (p instanceof Animal){
Panda a = (Panda) p;
a.study();
}else if (p instanceof NewDoctor){
NewDoctor do1 = (NewDoctor) p;
}
测试他左遍的对象是否是它右边的实例,返回boolean类型的数据,
这个关键字通常和向下转型(强制类型转换)结合使用来进行规避
报错
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix