1.多态(多种状态)基本介绍
方法或对象具有多种形态,是面向对象的第三大特征,多态是建立在封装和继承的基础上的
2.多态的具体实现
1)方法的多态
A a=new A();//方法重载体现多态
//这里我们传入不同的参数,就会调用不同的sum方法,就体现出多态
System.out.println(a.sum(10,20));
System.out.println(a.sum(10,20,30));
B b=new B();//方法重写体现多态
a.say();
b.say();
2)对象的多态
(重要!)
- 一个对象的编译类型和运行类型可以不一致
Animal animaI=new Dog(); [animal编译类型是Animal,运行类型是Dog]
- 编译类型在定义对象时,就确定了,不能改变
- 运行类型是可以改变的
animal=new Cat(); [animal的运行类型变成了Cat,编译类型依然是Animal]
- 编译类型看定义时=的左边,运行类型看=的右边
3.多态的注意事项和细节
多态的前提:两个对象(类)存在继承关系
- 多态的向上转型:
1)本质:父类的引用指向了子类的对象
2)语法:父类类型 引用名 = new 子类对象();
3)特点:编译类型看左边,运行类型看右边。可以调用父类中的所有成员(需遵守访问权限)。不能调用子类中的特有成员;最终运行结果看子类中的具体实现。
- 多态的向下转型:
Cat cat=(Cat)animal;
1)语法:子类类型 引用名 = (子类类型) 父类引用
2)只能强转父类的引用,不能强转父类的对象
3)要求父类的引用必须指向的是当前目标类型的对象
4)可以调用子类类型中的所有成员
- 属性没有重写之说!属性的值看编译类型
public class PolyDetails {
public static void main(String[] args) {
//属性没有重写之说,属性的值看编译类型
Base base=new Sub();//向上转型
System.out.println(base.count);//10
}
}
class Base {
int count=10;//属性
}
class Sub extends Base{
int count =20;
}
- instanceOf比较操作符,用于判断对象的运行类型是否为XXL类型或XX类型的子类型
public class PolyDetails02 {
public static void main(String[] args) {
// BB bb = new BB();
// System.out.println(bb instanceof BB);//true
// System.out.println(bb instanceof AA);//true
AA aa=new BB();//编译类型是AA,运行类型是BB
System.out.println(aa instanceof AA);//true
System.out.println(aa instanceof BB);//true
}
}
class AA{}
class BB extends AA{}
练习:
4.java的动态绑定机制(重要)
dynamic动态的
Java的动态绑定机制!
1.当调用对象方法时候,该方法会和该对象的内存地址/运行类型绑定
2.当调用对象属性时,没有动态绑定机制,哪里声明哪里使用
举例如下,好好体会
public class Test {
public static void main(String[] args) {
Worker tom = new Worker("tom", 100);
Manager xiaoyu = new Manager("xiaoyu", 15000, 5000);
Test test = new Test();//new一个test对象
test.showEmpAnnual(tom);//调用方法
test.showEmpAnnual(xiaoyu);
test.testWork(tom);
test.testWork(xiaoyu);
}
public void showEmpAnnual(Employee e){
System.out.println(e.getAnnual());//动态绑定
}
public void testWork(Employee e) {
if (e instanceof Worker) {//向下转型
((Worker) e).work();
} else if(e instanceof Manager){
((Manager) e).manage();
}
}
}
【Day 108】