当前位置: 首页 > news >正文

多态.Java

(1)什么是多态?

  • 同类型的对象,表现出不同的形态。前者指父类,后者指不同的子类

说简单点,就是父类的同一种方法,可以在不同子类中表现出不同的状态,或者说在不同子类中可以实现不同的效果(重写)。

(2)多态的前提

  • 有继承/实现关系------有了继承才有子父类之分
  • 有父类引用指向子类对象------,如:Animal a = new Dog(); ——小到大,向上转型。这里父类引用指向子类对象,其实相当于把子类对象当父类对象来用,所以这是一种向上转型的引用。
  • 有方法重写------在不同的子类中重写父类方法,实现自己不同的功能。当然也可以不重写,主要是重写这个功能使得每个子类都独具一格,不会全都相同,这是多态重要的一点。

(3)多类的好处

  • 方法使用父类类型作为形参,就可以接收所以子类对象,体现多态的扩展性与便利

(4)多态的表现形式

  • 父类类型  对象名称=new  子类类型();
Fu a=new Zi();

(5)调用的特点

  • 成员变量:编译看左边,运行也看左边
  • 成员方法:编译看左边,运行看右边(子类如果进行方法重写的话,父类里的方法就被覆盖

(6) 多态弊端是什么?

  • 不能调用子类特有功能,因为编译看左边,特有功能表示父类没有,代码直接报错

(7)引用数据类型的转换有几种方式?

  • 自动类型转换
  • 强制类型转换(可解决弊端)
//自动类型转换
Person p=new Student;//小(Student)--->大(Person)
//强制类型转换
Student s=(Student)p;//大(Person)--->小(Student)

(8)强制类型转换能解决什么问题?

  • 可以把对象转换成真正的子类类型,从而调用子类的特有功能
  • 转换类型与真实对象类型不一致会报错
  • 转换的时候用instanceof关键字进行判断它属于哪个子类

(9)综合练习

  • 根据需求完成代码

父类Animal

package duotai;public class Animal {private String color;private int age;public Animal() {}public Animal(String color, int age) {this.color = color;this.age = age;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void eat(String something){System.out.println("动物在吃"+something);}
}

 子类Dog

package duotai;public class Dog extends Animal{public Dog() {}public Dog(String color, int age) {super(color, age);}@Overridepublic void eat(String something) {System.out.println("此时此刻"+getAge()+"岁"+getColor()+"颜色的狗抱着"+something+"猛吃");}public void lookHome(){System.out.println("狗在看家");}}

子类Cat

package duotai;public class Cat extends Animal{public Cat() {}public Cat(String color, int age) {super(color, age);}@Overridepublic void eat(String something) {System.out.println("此时此刻"+getAge()+"岁"+getColor()+"颜色的猫眯着眼吃"+something);}public void catchMouse(){System.out.println("猫抓老鼠");}
}

Person类

package duotai;public class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}/*public void keepDog(Dog dog,String someting){System.out.println(this.age+"的"+this.name+"养了一条"+dog.getColor()+"的"+dog.getAge()+"岁的狗");dog.eat(someting);}public void keepCat(Cat cat,String someting){System.out.println(this.age+"岁的"+this.name+"养了一条"+cat.getColor()+"的"+cat.getAge()+"的小猫");cat.eat(someting);}//一个一个构造饲养动物的方法,过于繁琐*///构造一个方法,能够接收所有的动物//方法的形参:可以写这些类的父类,就可以接收所以子类对象(多态)public void keepPet(Animal a,String something){//if条件语句判断它属于哪一个子类,进行强转,就可以使用子类特有的方法if(a instanceof Dog ){Dog d=(Dog)a; //Animal强转成DogSystem.out.println(this.age+"的"+this.name+"养了一条"+a.getColor()+"的"+a.getAge()+"岁的狗");a.eat(something);d.lookHome();} else if (a instanceof Cat ) {Cat c=(Cat)a; //Animal强转成CatSystem.out.println(this.age+"的"+this.name+"养了一条"+a.getColor()+"的"+a.getAge()+"岁的小猫咪");a.eat(something);c.catchMouse();}else {System.out.println("没有这种动物");}}
}

测试类

package duotai;public class Test {public static void main(String[] args) {/*Person p1=new Person("西施",15);Dog d=new Dog("粉红",2);p1.keepDog(d,"美味的鸡叉骨");//选中+shift+F6:批量修改Person p2=new Person("花木兰",16);Cat c=new Cat("淡黄",4);p2.keepCat(c,"美味的小鱼干");*/Person p1=new Person("西施",15);Dog d=new Dog("粉红",2);p1.keepPet(d,"美味的鸡叉骨");Person p2=new Person("花木兰",16);Cat c=new Cat("淡黄",3);p2.keepPet(c,"美味的小鱼干");}
}

结果

 注意:

http://www.lryc.cn/news/333355.html

相关文章:

  • SSL根证书是什么
  • 大模型量化技术-GPTQ
  • NzN的数据结构--实现双向链表
  • easyexcel-获取文件资源和导入导出excel
  • Android Monkey自动化测试
  • C++ //练习 11.20 重写11.1节练习(第376页)的单词计数程序,使用insert代替下标操作。你认为哪个程序更容易编写和阅读?解释原因。
  • Nginx 安装与实践
  • QT 创建线程的几种方法
  • RocketMQ的简单使用
  • 速盾:服务器有cdn 带宽上限建议多少
  • 智慧工地安全+绿色施工方案
  • SQL Server 存储过程:BBS论坛(表结构文档下载及30个存储过程)
  • 03 Python进阶:MySQL - mysql-connector
  • InnoDB 行记录格式(“存储一行行数据的结构“)
  • 【洛谷】P9236 [蓝桥杯 2023 省 A] 异或和之和
  • ThreadLocal加切面实现线程级别的方法缓存
  • 使用 Flume 将 CSV 数据导入 Kafka:实现实时数据流
  • 对代理模式的理解
  • #QT项目实战(天气预报)
  • 数据挖掘|关联分析与Apriori算法详解
  • ChatGPT Excel 大师
  • C 语言中的 end, _end 符号
  • 绿联 安装PDF工具
  • 备战蓝桥杯---数论相关问题
  • 苹果手表Apple Watch录了两个半小时的录音,却只能播放4秒,同步到手机也一样,还能修复好吗?
  • RGB三通道和灰度值的理解
  • ARM、X86、RISC-V三分天下
  • 力控机器人原理及力控制实现
  • 最小生成树
  • 二维动画制作软件 Animate 2024 for mac激活版