Java中面向对象三大特性之——多态
2024-08-23 20:32:24
多态的概述:
多态是继封装、继承之后,面向对象的第三大特性。
生活中,比如跑的动作,小猫、小狗和大象,跑起来是不一样的。再比如飞的动作,昆虫、鸟类和飞机,飞起来也是不一样的。可见,同一行为,通过不同的事物,可以体现出来的不同的形态。多态,描述的就是这样的状态。
多态的条件
1.继承
2.方法的重写 (为了让多态有意义)
3.父类的引用指向子类的对象
多态的体现
父类类型 变量名 = new 子类对象;
变量名.方法名();
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,执行的是子类重写后方法。
举例代码
定义父类:
public abstract class Animal {
public abstract void eat();
}
定义子类:
class Cat extends Animal {
public void eat() {
System.out.println("吃鱼");
}
} class Dog extends Animal {
public void eat() {
System.out.println("吃骨头");
}
}
定义测试类:
public class Test {
public static void main(String[] args) {
// 多态形式,创建对象
Animal a1 = new Cat();
// 调用的是 Cat 的 eat
a1.eat(); // 多态形式,创建对象
Animal a2 = new Dog();
// 调用的是 Dog 的 eat
a2.eat();
}
}
多态的好处
实际开发的过程中,父类类型作为方法形式参数,传递子类对象给方法,进行方法的调用,更能体现出多态的扩展性与便利。
举例代码
定义父类:
public abstract class Animal {
public abstract void eat();
}
定义子类:
class Cat extends Animal {
public void eat() {
System.out.println("吃鱼");
}
} class Dog extends Animal {
public void eat() {
System.out.println("吃骨头");
}
}
定义测试类:
public class Test {
public static void main(String[] args) {
// 多态形式,创建对象
Cat c = new Cat();
Dog d = new Dog(); // 调用showCatEat
showCatEat(c);
// 调用showDogEat
showDogEat(d); /*
以上两个方法, 均可以被showAnimalEat(Animal a)方法所替代
而执行效果一致
*/
showAnimalEat(c);
showAnimalEat(d);
} public static void showCatEat (Cat c){
c.eat();
} public static void showDogEat (Dog d){
d.eat();
} public static void showAnimalEat (Animal a){
a.eat();
}
}
多态成员的访问特点:
访问成员变量: 编译看左边,运行看左边
访问成员方法:
非静态成员方法: 编译看左边,运行看右边
静态成员方法: 编译看左边,运行看左边
记忆: 只有非静态成员方法才会编译看左边,运行看右边,其他的都是编译看左边,运行看左边
多态的好处
使用父类类型作为方法的参数,可以接收该类所有的子类对象
tips: 如果方法的参数是Object类型,那么就可以接收任意类的对象
多态的弊端
无法调用子类特有的方法
(关于如何解决多态的弊端,可以看下一章引用类型的转换)
最新文章
- Java代码执行顺序(静态变量,非静态变量,静态代码块,代码块,构造函数)加载顺序
- 未找到导入的项目,请确认 <;Import>; 声明中的路径正确
- html中的图片直接使用字符串代替
- 推荐两篇Unity与Android交互的文章
- DataGridView过滤区分大小写问题
- Eclipse中修改SVN用户名和密码方法
- table表格cellspacing与cellpadding属性
- SQL Server 缓存清理的一些原因
- Unigine 基础入门
- Size Balanced Tree(SBT) 模板
- 关于Cesium中的常用坐标系及说明
- Kubernetes 网络排错指南
- linux系统命令大全
- display position 和float的作用和关系
- 使用 Azure Active Directory 管理 Azure 中的 HPC Pack 群集
- cancel_delayed_work和flush_scheduled_work【转】
- Codeforces 584E Anton and Ira
- Spring Boot开发之明月千城(一)
- Windows server 2008 R2如何预览图片而不是显示图标?
- Oracle学习笔记:实现select top N的方法
热门文章
- Redis: 改变HomeBrew安装的数据库文件目录
- [JavaEE] JTA, Java Transaction API, Repository for DB opreations
- OpenCV2马拉松第17圈——边缘检測(Canny边缘检測)
- Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群
- 苹果官方Instruments工具之Automation的介绍
- YTU 2720: 删出多余的空格
- P3959 宝藏 状压dp
- vs2010 下使用C#开发activeX控件
- PCB OD工具破解实例应用
- Mechanize抓取数据【Ruby】