JAVA笔记-多态的意义(向上转型与向下转型)

时间:2021-09-01 19:36:17

多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,就是同一种事物表现出的多种形态。

编程其实就是一个将具体世界进行抽象化的过程,多态就是抽象化的一种体现,把一系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进行对话。 

对不同类的对象发出相同的消息将会有不同的行为。比如,你的老板让所有员工在九点钟开始工作, 他只要在九点钟的时候说:“开始工作”即可,而不需要对销售人员说:“开始销售工作”,对技术人员说:“开始技术工作”, 因为“员工”是一个抽象的事物, 只要是员工就可以开始工作,他知道这一点就行了。至于每个员工,当然会各司其职,做各自的工作。

多态允许将子类的对象当作父类的对象使用,某父类型的引用指向其子类型的对象,调用的方法是该子类型的方法。这里引用和调用方法的代码编译前就已经决定了,而引用所指向的对象可以在运行期间动态绑定。再举个比较形象的例子:

比如有一个函数是叫某个人来吃饭,函数要求传递的参数是人的对象,可是来了一个美国人,你看到的可能是用刀和叉子在吃饭,而来了一个中国人你看到的可能是用筷子在吃饭,这就体现出了同样是一个方法,可以却产生了不同的形态,这就是多态!

多态的作用:

1. 应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。//继承

2. 派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。 //多态的真正作用,以前需要用switch实现


package day14;


public class Demo01 {
public static void main(String[] args) {
//多态测试

//1.父类型定义的变量可以引用任意子类型的实例  向上造型
/*
*1.该引用只能调用父类中定义的方法和变量(就是可以调用子类中重写了父类的方法,子类中其他方法则不能调用)
*2.如果子类中重写了父类中的一个方法,则父类类型引用在调用这个方法的时候,一定是调用子类中(动态连接,动态调用)
*/
Koo k1 = new Koo();
Foo f1 = new Foo();
Super s1 = k1;//向上造型

s1 = f1;
//s1.pay();//编译错误,父类型里没有这个方法。

//接口也是父类型,定义变量也可以引用子类型
Free ff = f1;

//2.强制转型(父类型赋值到子类型)(向下造型)
/*
* 若想使用子类中的其他方法,就需要向下转型
*/
Super ss1 = new Foo();
Super ss2 = new Koo();

Free ff1 = new Foo();
Free e = (Free)ss1;
e.pay();//向下转型后,就可以使用子类型的方法了。
//运行正常:运行期间实际对象是目标类型
Foo fx = (Foo)ss1;
Koo kx = (Koo)ss2;
Foo fy = (Foo)ff1;
//失败情况:运行期间实际引用的对象不是目标类型,会出现与型异常
Foo f3 = (Foo)ss2;
Koo k3 = (Koo)ss1;
Free ex = (Free)ss2;
//3.利用instanceof 实现类型安全 强制转换
//先判断类型,再进行转化,可以避免异常
if(ss1 instanceof Free){
Free fk = (Free)ss1;
fk.pay();
}
}
}
class Koo extends Super{
}
class Foo extends Super implements Free{

public void pay(){
System.out.println("pay");
}

}


class Super{
public void test(){
System.out.println("test");
}
}


interface Free{
void pay();
}