多态的概述: 

多态是继封装、继承之后,面向对象的第三大特性。

生活中,比如跑的动作,小猫、小狗和大象,跑起来是不一样的。再比如飞的动作,昆虫、鸟类和飞机,飞起来也是不一样的。可见,同一行为,通过不同的事物,可以体现出来的不同的形态。多态,描述的就是这样的状态。

多态的条件

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类型,那么就可以接收任意类的对象

多态的弊端

无法调用子类特有的方法

(关于如何解决多态的弊端,可以看下一章引用类型的转换

最新文章

  1. Java代码执行顺序(静态变量,非静态变量,静态代码块,代码块,构造函数)加载顺序
  2. 未找到导入的项目,请确认 <Import> 声明中的路径正确
  3. html中的图片直接使用字符串代替
  4. 推荐两篇Unity与Android交互的文章
  5. DataGridView过滤区分大小写问题
  6. Eclipse中修改SVN用户名和密码方法
  7. table表格cellspacing与cellpadding属性
  8. SQL Server 缓存清理的一些原因
  9. Unigine 基础入门
  10. Size Balanced Tree(SBT) 模板
  11. 关于Cesium中的常用坐标系及说明
  12. Kubernetes 网络排错指南
  13. linux系统命令大全
  14. display position 和float的作用和关系
  15. 使用 Azure Active Directory 管理 Azure 中的 HPC Pack 群集
  16. cancel_delayed_work和flush_scheduled_work【转】
  17. Codeforces 584E Anton and Ira
  18. Spring Boot开发之明月千城(一)
  19. Windows server 2008 R2如何预览图片而不是显示图标?
  20. Oracle学习笔记:实现select top N的方法

热门文章

  1. Redis: 改变HomeBrew安装的数据库文件目录
  2. [JavaEE] JTA, Java Transaction API, Repository for DB opreations
  3. OpenCV2马拉松第17圈——边缘检測(Canny边缘检測)
  4. Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群
  5. 苹果官方Instruments工具之Automation的介绍
  6. YTU 2720: 删出多余的空格
  7. P3959 宝藏 状压dp
  8. vs2010 下使用C#开发activeX控件
  9. PCB OD工具破解实例应用
  10. Mechanize抓取数据【Ruby】