一、多态
多态就是同一个行为有多个不同表现形式和形态的能力
比如:
flash界面按F1按键弹出是AS 3帮助文档
在Word下弹就是Word帮助
二、多态存在的三个必要条件
继承、重写、父类引用指向子类对象
Parent p = new Child();
三、使用多态调用方法时,先检查父类中是否有该方法,没有则编译错误,有 再去调用子类的同名方法
实例如下:
abstract class Animal { //定义了一个抽象类
abstract void eat(); //定义一个抽象方法
}
class Cat extends Animal { //子类Cat继承父类Animal
public void eat() { //定义吃的方法
System.out.println("吃鱼");
}
public void work() {
System.out.println("抓老鼠");
}
}
class Dog extends Animal { //子类Dog继承父类Animal类
public void eat() {
System.out.println("吃骨头");
}
public void work() {
System.out.println("看家");
}
}
方法调用如下:
public class Test {
public static void main(String[] args) {
show(new Cat()); // 以 Cat 对象调用 show 方法、new一个对象,然后直接调用这个对象的show()方法。
show(new Dog()); // 以 Dog 对象调用 show 方法
Animal a = new Cat(); // 向上转型
a.eat(); // 调用的是 Cat 的 eat
Cat c = (Cat) a; // 向下转型
c.work(); // 调用的是 Cat 的 work
}
public static void show(Animal a) {
a.eat();
// 类型判断
if (a instanceof Cat) { // 猫做的事情
Cat c = (Cat) a;
c.work();
} else if (a instanceof Dog) { // 狗做的事情
Dog c = (Dog) a;
c.work();
}
}
}
四、虚方法
方法的重新:子类能够重新父类的方法
子类对象调用重新的方法 调用的是子类的方法 而不是父类中被重写的方法
要想调用父类中被重写的方法 则必须使用关键字super
如下:实例化了俩个对象:一个使用Salary引用s,另一个使用Employee引用e.
Salary s = new Salary("员工 A", "北京", 3, 3600.00);
Employee e = new Salary("员工 B", "上海", 2, 2400.00);
五、多态的实现方式
方式一:重写(详情Java知识25 重写和重载)
方式二:生活中接口最具代表性的就是插座
方式三:抽象类和抽象方法
六、多态总结
1.使用父类类型的引用指向子类的对象
2.该引用只能调用父类中定义的方法和变量
3.子类重写父类的方法,调用这个方法的时候,会调用子类中的这个方法(动态连接、动态调用)
4.变量不能被重写,重写的概念只针对方法 重写了变量编译会直接报错,类的属性变量是可以重写的。
七、构造子类对象时的构造方法的调用顺序
1.先调用超类的构造方法,多重超类首先调用最远超类的方法
2.然后再执行当前子类的构造方法