多态的简单应用
前言
Java引用变量有两个类型:一个是编译时类型,一个是运行时类型,编译时类型由声明该变量时使用的类型决定,运行时由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现所谓的多态(Polymorphism)。
一、多态是什么?
多态性是指同一操作作用于某一类对象,可以有不同的解释,产生不同的执行结果。
二、多态存在的三个必要条件
1、需要存在继承和实现关系
2、同样的方法调用而执行不同的操作、运行不同代码(重写操作)
3、在运行时父类或者接口的引用变量可以引用其子类的对象
三、多态的作用
1、多态通过分离做什么和怎么做, 从另一个角度将接口和实现进行分离
2、”多态“则消除了类型之间的耦合关系
3、多态的存在提高了程序的扩展性和后期的可维护性
四、对象上下转型
1、由子类转型成父类,在继承图上是向,上移动的,一般称为向上转型
2、向上转型是从一个较专用类型向较通用类型转换,所以总是安全的,也就是说,子类是父类 的一个超集
3、向上转型过程中,类接口中唯一可能发生的事情是丢失方法,而不是获取方法
4、与之相反的操作是向下转型,不安全( 可能需要instanceof操作符协助)
5、LSP(liskov替换原则):子类型必须能够替换掉它们的基类型
6、安全的上转型和LSP的实施, 充分体现继承的“is-a”关系
五、instanceof的使用
1、instanceof运算符用来在运行时通过返回一个布尔值来指出对象是否是特定类或者是它的子类的一个实例
2、用法
result = object instanceof class
result:布尔类型
object:必选项,任意对象表达式
class:必选项,任意已定义的对象类
说明:如果object是class或其子类的一个实例,则instanceof运算符返回true, 如果不是或者object是null,则返回false
3、使用场合
在对对象做下转型之前,没有其它有关对象类型信息时务必使用instanceof 来判断一下,以避免抛出ClassCastException异常。
六、动态绑定/静态绑定
静态:
1、在程序执行前方法已经被绑定,针对java简单的可以理解为程序编译期的绑定(静态绑定) java当中的方法是final, static, private和构造方法都是前期绑定的。
2、静态绑定在编译期进行
动态:
1、运行时,根据变量实际引用的对象类型决定调用哪个方法
2、动态绑定在运行期进行
多态的概念基于对象引用的动态绑定特性
七、案例
案例一:
代码如下:
package com.aaa.test;
import java.util.Calendar;
public class AnimalDemo {
public static void main(String[] args){
/*父类的引用变量可以引用子类的对象*/
Animal animal = new Cat("火锅");/*向上转型*/
animal.eating();
/*animal.sleeping();[方法丢失]*/
/*Cat cat = animal*/;/*向下转型不安全*/
if (animal instanceof Cat) {
System.out.println("转化成功");
Cat cat = (Cat)animal;
}
}
}
class Animal{
private String name;
public Animal(){}
public Animal(String name){
this.name = name;
}
public void eating(){}
}
class Cat extends Animal{
public Cat(String name){
super(name);
}
public void eating() {
System.out.println("猫吃鱼");
}
public void sleeping(){
System.out.println("小猫爱睡觉");
}
}
案例2:
代码如下:
package com.aaa.test;
public class PrintDemo {
public static void main(String[] args) {
School school = new School();
ColorPrint cp = new ColorPrint();
school.setPrint(cp);
school.print("java");
}
}
class School{
private Printer p;
public void setPrint(Printer p){
this.p = p;
}
public void print(String content){
p.print(content);
}
}
class Printer{
public void print(String content){}
}
class ColorPrint extends Printer{
public void print(String content){
System.out.println("彩色打印"+content);
}
}
class BlackPrint extends Printer{
public void print(String content){
System.out.println("黑白打印"+content);
}
}
结果如下: