文章目录
- 面向对象的多态性(polymorphic 多态)
- 一、多态的基本概念
- 二、测试案例
- 2.1 父类
- 2.2 子类
- 2.3 测试类
面向对象的多态性(polymorphic 多态)
一、多态的基本概念
1.概念:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。
- animal、cat、bird三个类之间的关系:cat、bird 都
继承
animal类,都属于Animal对象 - 但是cat、bird 可以有不同的行为
2.关于多态中的概念:
- 向上转型:(upcasting)
子类转为父类 又叫自动类型转换 - 向下转型:(downcasting)
父类转为子类 又叫强制类型转换【强制类型转换符】 - 两者之间必须有继承关系 ,否则无法编译
3.为什么要用多态呢?
原因:我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了 — 代码重用。而多态除了代码的复用性外,还可以解决项目中紧偶合的问题,提高程序的可扩展性.。耦合度讲的是模块模块之间,代码代码之间的关联度,通过对系统的分析把他分解成一个一个子模块,子模块提供稳定的接口,达到降低系统耦合度的的目的,模块模块之间尽量使用模块接口访问,而不是随意引用其他模块的成员变量。
返回顶部
二、测试案例
2.1 父类
package 多态;
//动物类
public class Animal {
public void move(){
System.out.println("动物在移动。");
}
}
2.2 子类
package 多态;
//鸟类
public class Bird extends Animal {
//重写父类方法
public void move(){
System.out.println("鸟儿在飞翔。");
}
}
package 多态;
//猫类
public class Cat extends Animal {
//重写父类方法
public void move(){
System.out.println("猫在走猫步。");
}
//猫类中特有的方法
public void catchMouse(){
System.out.println("猫抓老鼠!");
}
}
2.3 测试类
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Animal a = new Animal();
a.move();
Cat c = new Cat();
c.move();c.catchMouse();
Bird b = new Bird();
b.move();
//使用多态语法机制
/**
* 1.Cat is an animal
*
* 2.new Cat() 创建的对象类型是Cat,a1的数据类型是 Animal,可见他们进行了数据类型转换
*
* 3.子类转换为父类,upcasting(自动类型转换)
*
* 4.Java中允许:父类型引用指向子类型对象
*/
Animal a1 = new Cat();
// Cat c = new Bird(); 编译报错,因为两种类型之间不存在继承关系,无法向上或向下转型
/**
* 1.Java程序永远都分为编译阶段和运行阶段
*
* 2.先分析编译阶段,再分析运行阶段,编译阶段无法通过,根本是无法运行的
* 编译阶段编译器检查a1这个引用的数据类型为Animal,由于Animal.class字节码中只有move()方法,所以编译通过了
* 这个过程我们称之为静态绑定,编译阶段绑定。
*
* 3.只有在静态绑定成功之后才有后续的运行。
*
* 4.在程序运行阶段,jvm的堆内存中真实创建的对象是Cat对象,那么以下程序运行阶段一定会用Cat的move方法,此时发生
* 了程序的动态绑定,运行阶段绑定
*
* 5.父类型引用指向子类型对象导致程序存在编译阶段绑定和执行阶段绑定两种不同的形态/状态
* 这种机制可以成为一种多态语法机制
*/
a1.move();
/**
* 1.分析不能调用a1.catchMouse();
* 因为编译器在检查到a2的类型为Animal,在Animal.class字节码文件中没有找到该方法,
* 导致静态绑定失败
* 2.当子类中特有的方法时,需要进行类型转换
*/
/**
* 假设想执行catchMouse(),a1无法直接实现,
* 可以将其转化类型
* a1类型为Animal,转换成Cat类型。
* 当调用的方法或属性是子类型中特有的,必须进行向下类型转换
*
*/
Cat c2 =(Cat)a1;
c2.catchMouse();
返回顶部