多态
Java 引用变量有两个类型: 一个是编译时类型, 一个是运行时类型。编译时类型由声明该变量时使用的类型决定, 运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致, 就可能出现所谓的多态
多态意味着在一次调用中,根据包含的对象的实际类型(实际的子类对象)来决定应该调用哪个方法。当调用一个方法是,为了实现多态的操作,这个方法即使在父类中声明过,也必须在子类中重写过的方法
概念:
多态指允许不同的类的对象对同一消息做出响应,即对同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用)
实现多态的技术称为动态绑定(dynamic binding)
动态绑定是指在执行期间判断所引用的实际类型,根据其实际的类型调用其相应的方法
作用
多态的作用就是消除类型之间的耦合关系
多态存在的三个必要条件
1:要有继承
2:要有重写
3:父类指向子类对象
多态的好处:
可替换性:多态对已存在代码具有可替换性。
可扩展性:多态对代码具有可扩展性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。
接口类:多态是超类通过方法签名,向子类提供了一个共同接口,有子类来完善或者覆盖它而实现的
灵活类:他在应用体现了灵活多样的操作,提高了使用效率
简化类:多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要
多态的使用:
向上转型
子类向父类的转换称为向上转型
1.向上转型是将一个子类对象直接赋值给一个父类引用变量。它不关心子类新增的功能,只关心子类继承和重写的功能。即丢失了子类扩展的方法。
2.当一个类有很多子类时,并且这些子类都重写了父类中的某个方法。
3.当使用上转型对象在调用这个方法时就可能具有多种形态。因为不同的子类在重写父类的方法时可能产生不同的行为。也就是说,不同对象的上转型对象调用同一方法可能产生不同的行为。
语法格式:
<父类型><引用变量名>=new <子类型>();
Object msg = new String();
向下转型
将一个指向子类对象的父类引用赋给一个子类的引用 ,即将父类类型转换为子类类型,称为向下转型,此时必须强制类型转换
语法格式:
<父类型> <引用变量名> = new (<子类型> ) <父类型的引用变量>;
String str2 = (String) str
<父类型> <引用变量名> =new (<子类型>)<父类型的引用变量>;
String msg = (String) str
instanceof 运算符
在向下转型过程中,如果不是转换为真实子类类型,会出现类型转换异常。需要使用instanceof 运算符来进行 类型的判断
instanceof 左边的变量类型和右边的类要么相同,要么是与右边的类有父子继承关系,否则都会引起报错
语法格式
if( 变量 instanceof 类型) {}
案例代码:
package Demo01;
/**
* @version 1.0
* @author: jiazhihao
* @date: 2021-05-07 10:45
*/
public class Demo01 {
public static void main(String[] args) {
// 调用
Demo03 dog = new Dog();
dog.shout();
Demo03 cat = new cat();
cat.shout();
animalShout(cat);
animalShout(dog);
}
public static void animalShout(Demo03 demo03) {
if (demo03 instanceof cat) {
cat cat = (cat) demo03;
cat.shout();
} else {
System.out.println("传入参数类型错误");
}
}
}