资讯动态

13-多态和抽象

发布时间:2026/10/18 23:48:00 来源:尧图企业网站定制
多态什么是多态多态的表现形式多态的前提示例多态的好处多态调用成员的特点变量调用方法调用多态的弊端类型转换强制类型转换的注意事项instanceof关键字示例多态联系练习一抽象类和抽象方法定义格式小贴士示例注意事项配套完整代码GitHub仓库https://github.com/LIN-commit/java-learning代码所在目录java-learning/polymorphic_and_abstract/多态什么是多态多态事物的多种形态Student stu new Student();该对象为Student学生形态Person per new Student();该对象实际类型是Student,只是被Person类型的引用变量指向了是多态的典型写法多态的表现形式父类类型 对象名称 子类对象;多态的前提有继承/实现关系有父类引用指向子类对象Fu f new Zi();示例题目学生类属性姓名账号密码行为work:学生的工作是学习老师类属性姓名账号密码行为work:老师的工作是教书学生管理系统行为注册register要求能注册所有的角色输出姓名为张三的同学注册成功账号zhangsan密码123456对应package:example1对应代码Person.javaStudent.javaTeacher.javaStudentManager.javaTest.javapackageexample1;publicclassPerson{privateStringname;privateStringnumber;privateStringpassword;publicPerson(){}publicPerson(Stringname,Stringnumber,Stringpassword){this.namename;this.numbernumber;this.passwordpassword;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.namename;}publicStringgetNumber(){returnnumber;}publicvoidsetNumber(Stringnumber){this.numbernumber;}publicStringgetPassword(){returnpassword;}publicvoidsetPassword(Stringpassword){this.passwordpassword;}publicvoidwork(){System.out.println(work);}}packageexample1;publicclassStudentextendsPerson{publicStudent(){}publicStudent(Stringname,Stringnumber,Stringpassword){super(name,number,password);}Overridepublicvoidwork(){System.out.println(学生的工作是学习);}}packageexample1;publicclassTeacherextendsPerson{publicTeacher(){}publicTeacher(Stringname,Stringnumber,Stringpassword){super(name,number,password);}Overridepublicvoidwork(){System.out.println(老师的工作是教书);}}packageexample1;publicclassStudentManager{publicvoidregister(Personperson){System.out.println(姓名为person.getName()的账户注册成功账号为person.getNumber()密码person.getPassword());person.work();}}packageexample1;publicclassTest{publicstaticvoidmain(String[]args){PersonstunewStudent(张三,zhangsan,123456);StudentManagersnewStudentManager();s.register(stu);PersontnewTeacher(蓝猫学姐,bluecat,456789);s.register(t);}}[运行结果]姓名为张三的账户注册成功账号为zhangsan密码123456 学生的工作是学习 姓名为蓝猫学姐的账户注册成功账号为bluecat密码456789 老师的工作是教书多态的好处方法中使用父类型作为参数可接收父类对象所有子类对象如果子类中进行方法重写利用多态调用方法可以调用不同子类中重写的方法多态调用成员的特点变量调用编译看左边运行也看左边方法调用编译看左边运行看右边变量调用publicclassFu{Stringnamefu;}publicclassZiextendsFu{Stringnamezi;}FufnewZi();System.out.println(f.name);[运行结果]fu编译看左边把java文件编译成class文件的时候看父类当中有没有这个变量如果有则编译成功没有就编译失败在上述代码中就看父类中有没有name这个变量运行也看左边在代码真正运行的时候使用父类中的变量所以上述代码的运行结果是fu方法调用编译看左边在父类中有没有这个方法如果没有代码报错运行看右边在代码真正运行的时候运行的是子类里面的方法如果子类没有重写父类里面的方法使用的还是父类中的方法publicclassFu{publicvoidmethod(){System.out.println(fu);}}publicclassZiextendsFu{publicvoidmethod(){System.out.println(zi);}}publicclasstest{publicstaticvoidmain(String[]args){FusnewZi();s.method();}}[运行结果]zi多态的弊端多态下不能使用子类的独有功能类型转换自动类型转换从子到父子类对象赋值给父类类型的变量强制类型转换从父到子子类 对象变量 子类父类类型的变量PersonpnewStudent();Students(Student)p;作用可以解决多态的弊端可以实现调用子类的独有功能强制类型转换的注意事项转换类型与真实类型不一致会报错转换的时候用instanceof关键字进行判断instanceof关键字示例对应package:example2对应代码Person.javaFu.javaZi.javaTest.javapackageexample2;publicclassPerson{publicvoidshow(){System.out.println(Person中的show方法被调用了);}}packageexample2;publicclassFuextendsPerson{publicvoidfushow(){System.out.println(Fu类中独有的fushow方法被调用了);}}packageexample2;publicclassZiextendsFu{publicvoidzishow(){System.out.println(zi类中独有的zishow方法被调用了);}}packageexample2;publicclassTest{publicstaticvoidmain(String[]args){PersonpnewFu();/* 此时p的实际类型是Fu 但是遵循“调用方法编译看左边运行看右边” 所以如果想要调用Fu类中独有而Person类中没有的方法就要把p强制转为Fu类型 *///p.fushow();//报错因为Person类中没有fushow方法//Zi z (Zi)p;//编译不会报错但运行会报错//用instanceof关键字判断p是否是Fu类型if(pinstanceofFu){Fuf(Fu)p;}else{System.out.println(请确定好类型再进行转换);}}}多态联系练习一题目自行车属性品牌行驶速度行为移动move响铃ringBell汽车属性品牌行驶速度行为移动move鸣笛honk人属性名字年龄性别行为行驶交通工具能使用所有交通工具测试类中创建Person对象让这个人使用任意一款交通工具 、对应package:example3对应代码Transport.javaBike.javaCar.javaPerson.javaTest.javapackageexample3;publicclassTransport{privateStringbrand;privatedoublespeed;publicTransport(){}publicTransport(Stringbrand,doublespeed){this.brandbrand;this.speedspeed;}publicStringgetBrand(){returnbrand;}publicvoidsetBrand(Stringbrand){this.brandbrand;}publicdoublegetSpeed(){returnspeed;}publicvoidsetSpeed(doublespeed){this.speedspeed;}publicvoidmove(){System.out.println(brank交通工具正以speedkm/h的速度移动);}}packageexample3;publicclassBikeextendsTransport{publicBike(){}publicBike(Stringbrand,doublespeed){super(brand,speed);}Overridepublicvoidmove(){System.out.println(getBrand()的自行车正以getSpeed()km/h的速度移动);}publicvoidringBell(){System.out.println(铃铃铃~);}}packageexample3;publicclassCarextendsTransport{publicCar(){}publicCar(Stringbrand,doublespeed){super(brand,speed);}Overridepublicvoidmove(){System.out.println(getBrand()的汽车正以getSpeed()km/h的速度移动);}publicvoidhonk(){System.out.println(嘟嘟嘟~);}}packageexample3;publicclassPerson{privateStringname;privateintage;privateStringgender;publicPerson(){}publicPerson(Stringname,intage,Stringgender){this.namename;this.ageage;this.gendergender;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.namename;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.ageage;}publicStringgetGender(){returngender;}publicvoidsetGender(Stringgender){this.gendergender;}publicvoiduse(Transportt){t.move();//现在并不知道调用的是bike还是car所以不确定是鸣笛还是响铃if(tinstanceofBike){Bikeb(Bike)t;b.ringBell();}elseif(tinstanceofCar){Carc(Car)t;c.honk();}else{System.out.println(没有这个类型);}}}packageexample3;publicclassTest{publicstaticvoidmain(String[]args){PersonpnewPerson(蓝猫学姐,20,女);System.out.println(p.getName(), p.getAge(), p.getGender());BikebnewBike(迪卡侬,5);p.use(b);CarcnewCar(大众,20);p.use(c);}}[运行结果]蓝猫学姐, 20, 女 迪卡侬的自行车正以5.0km/h的速度移动 铃铃铃~ 大众的汽车正以20.0km/h的速度移动 嘟嘟嘟~抽象类和抽象方法定义抽象方法将共性的行为方法抽取到父类之后因为每一个子类的方法体是不一样的所以在父类中不能确定具体的方法体。该方法就可以定义为抽象方法抽象类如果一个类中存在抽象方法那么该类就必须申明为抽象类格式抽象方法public abstract 返回值类型 方法名参数列表抽象类public abstract class 类名{...}小贴士alt回车自动修复代码中的bug示例题目猫类属性名字颜色行为猫吃鱼猫抓老鼠猫喝水狗类属性名字颜色行为狗吃骨头狗看家狗喝水对应package:example4对应代码Animal.javaCat.javaDog.javaTest.javapackageexample4;publicabstractclassAnimal{privateStringname;privateStringcolor;publicAnimal(){}publicAnimal(Stringname,Stringcolor){this.namename;this.colorcolor;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.namename;}publicStringgetColor(){returncolor;}publicvoidsetColor(Stringcolor){this.colorcolor;}//eat抽象方法publicabstractvoideat();//喝水行为publicvoiddrink(){System.out.println(喝水);}}packageexample4;publicclassCatextendsAnimal{publicCat(){}publicCat(Stringname,Stringcolor){super(name,color);}Overridepublicvoideat(){System.out.println(猫吃鱼);}publicvoidcatchMouse(){System.out.println(猫抓老鼠);}}packageexample4;publicclassDogextendsAnimal{publicDog(){}publicDog(Stringname,Stringcolor){super(name,color);}Overridepublicvoideat(){System.out.println(狗吃骨头);}publicvoidlookHome(){System.out.println(狗看家);}}packageexample4;publicclassTest{publicstaticvoidmain(String[]args){CatcnewCat(小白,白色);System.out.println(c.getName(), c.getColor());c.eat();c.catchMouse();c.drink();System.out.println(-----------);DogdnewDog(大黄,黄色);System.out.println(d.getName(), d.getColor());d.eat();d.lookHome();d.drink();}}[运行结果]小白, 白色 猫吃鱼 猫抓老鼠 喝水 ----------- 大黄, 黄色 狗吃骨头 狗看家 喝水注意事项抽象类不能实例化Animal a new Animal();是错误的抽象类中不一定有抽象方法作用为了不让外界创建本类的对象有抽象方法的类一定是抽象类抽象类中可以有构造方法构造方法的作用为了给成员变量赋值抽象类的子类要么重写抽象类中所有的抽象方法要么子类也是抽象类以上就是面向对象中的多态和抽象内容了。下一篇我们将学习接口欢迎继续关注蓝猫学姐的java学习笔记~

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑