一、多态
1、基本介绍
方法或对象具有多种形态。是面向对象的第三大特征,多态是建立在封装和继承基础之上的
2、多态的具体体现
1)
方法的多态
重写和重载就体现多态
2)
对象的多态
(
核心,困难,重点
)
3、多态案例
4、多态注意事项和细节讨论
多态的
前提是
:两个对象
(
类
)
存在继承关系
多态的向上转型
多态的向下转型
向上转型
:
父类的引用指向了子类的对象
//
语法:父类类型引用名
= new
子类类型
();
Animal animal = new Cat();
Object obj = new Cat();//
可以吗
?
可以 ,
Object
也是
Cat
的父类
//
向上转型调用方法的规则如下
:
(1)
可以调用父类中的所有成员
(
需遵守访问权限
)
(2)
但是不能调用子类的特有的成员
(3)
因为在编译阶段,能调用哪些成员
,
是由编译类型来决定的
animal.catchMouse();
错误
(4)
最终运行效果看子类
(
运行类型
)
的具体实现
,
即调用方法时,按照从子类
(
运行类型
)
开始查找方法
,然后调用,规则我前面我们讲的方法调用规则一致。
//
多态的向下转型
(1)
语法:子类类型 引用名
=
(子类类型)父类引用
;
问一个问题
? cat
的编译类型
Cat,
运行类型是
Cat
Cat cat = (Cat) animal;
cat.catchMouse();//
猫抓老鼠
(2)
要求父类的引用必须指向的是当前目标类型的对象
5、instanceOf
instanceOf比较操作符,用于判断对象的运行类型是否为 XX 类型或 XX 类型的子类型
例:
System.out.println(bb instanceof BB);// true
System.out.println(bb instanceof AA);// true
//aa 编译类型
AA,
运行类型是
BB
//BB
是
AA
子类
AA aa = new BB();
System.out.println(aa instanceof AA);
System.out.println(aa instanceof BB);
Object obj = new Object();
System.out.println(obj instanceof AA);//false
String str = "hello";
//System.out.println(str instanceof AA);
System.out.println(str instanceof Object);//true
6、Java的动态绑定机制
代码
public class DynamicBinding {
public static void main(String[] args) {
//a 的编译类型 A, 运行类型 B
A a = new B();//向上转型
System.out.println(a.sum());//?40 -> 30
System.out.println(a.sum1());//?30-> 20
}
}
class A {//父类
public int i = 10;
//动态绑定机制:
public int sum() {//父类 sum()
return getI() + 10;//20 + 10
}
public int sum1() {//父类 sum1()
return i + 10;//10 + 10
}
public int getI() {//父类 getI
return i;
}
}
class B extends A {//子类
public int i = 20;
// public int sum() {
// return i + 20;
// }
public int getI() {//子类 getI()
return i;
}
// public int sum1() {
// return i + 10;
// }
}
7、多态的应用
)
多态数组
数组的定义类型为父类类型,里面保存的实际元素类型为子类类型
应用实例
:
现有一个继承结构如下:要求创建
1
个
Person
对象、
2
个
Student
对象和
2
个
Teacher
对象
,
统一放在数组中,并调用每个对象say 方法
.
应用实例升级:如何调用子类特有的方法,比如 Teacher 有一个
teach , Student
有一个
study
2)
多态参数