多态概述
多态概述
某一个事物,在不同时刻表现出来的不同状态。
举例:
猫可以是猫的类型。猫 m = new 猫();
同时猫也是动物的一种,也可以把猫称为动物。
动物 d = new 猫();
在举一个例子:水在不同时刻的状态
多态前提和体现
- 有继承关系
- 有方法重写
- 有父类引用指向子类对象
成员访问特点
- 成员变量
编译看左边,运行看左边
- 成员方法
编译看左边,运行看右边
- 静态方法
编译看左边,运行看左边 所以说静态方法不能算方法的重写
面试题1 看程序写结果(先判断有没有问题,如果没有,写出结果)
class Fu { public void show() { System.out.println("fu show"); } } class Zi extends Fu { public void show() { System.out.println("zi show"); } public void method() { System.out.println("zi method"); } } class Test { public static void main(String[] args) { Fu f = new Zi(); f.method(); } }
结果:
编译报错
Error:(28, 10) java: 找不到符号
符号: 方法 method()
位置: 类型为Day12.Fu的变量 f解释:
多态,访问成员方法,编译看左边,父类中没有method()方法
面试题2:看程序写结果(先判断有没有问题,如果没有,写出结果)
class A { public void show() { show2(); // 4 9 } public void show2() { System.out.println("我"); } } class B extends A { /* public void show() { show2(); } */ public void show2() { System.out.println("爱"); // 5 } } class C extends B { public void show() { super.show(); // 3 8 } public void show2() { System.out.println("你"); // 10 } } public class Test { public static void main(String[] args) { A a = new B(); // 1 a.show(); // 2 编译看左边,通过,运行看右边 B b = new C(); //6 b.show(); // 7 } }
结果:
爱你
解释:
1 --> 10
多态的好处和弊端
多态的好处
提高了程序的维护性(由继承保证)
提高了程序的扩展性(由多态保证)
多态的弊端
不能访问子类特有功能
那么我们如何才能访问子类的特有功能呢?
多态中的转型
多态中的转型问题
向上转型
从子到父
父类引用指向子类对象
向下转型
从父到子
父类引用转为子类对象
多态成员访问及转型的理解
孔子装爹案例