20190719(多态、instanceof关键字)
标签: java
多态
##1.什么是多态
一个父类的不同子类,对父类中声明的方法的不同调用
##2.为什么使用多态
父类引用调用方法,能够运行子类重写后的方法
##3.实现多态的步骤
3.1 编写父类(可以是抽象类),定义要重写的方法
3.2 子类继承父类,重写父类中的方法
3.3 子类对象赋给父类引用,父类引用调用重写后的方法
**ps:**描述中的父类可能是接口,子类可能是接口的实现类
##4.父类类型强制转换为子类类型
4.1 为什么需要将父类类型转换成子类类型
父类类型无法调用到子类独有成员(属性、方法)
//子类对象向上造型为父类类型
Pet p = new Dog();
//父类类型调用的方法是子类重写后的,但不能调用子类中的独有方法
//编译按父类编译,运行时才按子类运行
为了达到这个效果,我们可以强制类型转换(向下转型,官方没说是向下转型,所以说强转就行了)
4.2 转换格式
(子类类型) 父类引用
eg: (Dog) p; //p是Pet的引用
4.3 如何使用
转换后赋给子类引用 eg: Dog d = (Dog)p;
就地调用子类成员 eg: ((Dog)p).属性/方法;
Pet p = new Dog();
p.feed();
//转换后赋给子类引用
Dog d = (Dog)p;
d.catchFlyDisc();
//就地调用子类成员
((Dog)p).catchFlyDisc();
注意:强制类型转换,只能发生在有继承关系的类之间
强制转换的类型不匹配,会报异常 java.lang.ClassCastException (类型转换异常)
//不会报错,但运行会报异常
Pet p = new Cat();
Dog d = (Dog)p;
为了避免这个问题,我们需要使用 instanceof 关键字
instanceof关键字
1. 什么是 instanceof
专门用于判断一个对象,是否属于一个类型的关键字
2. 为什么使用 instanceof
在引用类型强转类型之前,进行判断,防止异常发生
3. 怎么使用 instanceof
引用 instanceof 类型
运行的结果是真或假,所以一般和 if 配合使用
eg:
Pet p = new Cat();
p.feed();
if(p instanceof Dog){
Dog d = (Dog)p;
d.catchFlyDisc();
((Dog)p).catchFlyDisc();
}else if(p instanceof Cat){
Cat c = (Cat)p;
c.washFace();
((Cat)p).washFace();
}else
System.out.println("类型不匹配");
注意: instanceof要有继承关系的才会真(爸爸的爸爸也算继承,类型写Object将都会是真),
平级或者无关都会报false