面向对象之多态
先给大家讲个笑话
多态的引入:
生活中的多态
在生活中我们听到“打”一声可能只是 击,敲,攻击的意思,但是其实在不同的环境下,打的意思非常多。
例如:打车,打电话,打雷,打证明,打包裹
多态的概述
生活中: 同一个动作在不同环境下表现出来的不同状态
Java中: 同一个方法在不同的对象中体现出来不同的状态
内存中: 父类引用指向子类对象
多态的实现的必要条件:(重点要记下)
1.存在继承关系
2.存在方法重写
3.父类引用指向子类对象
先给个小例子代码如下所示:
public class DuoTaiDemo01 {
public static void main(String[] args) {
Man m = new Doctor();
m.cut();
m = new Director();
m.cut();
m = new Hairdresser();
m.cut();
}
}
class Man {
public void cut() {
System.out.println("我是man, 我也不知道怎么cut");
}
}
class Doctor extends Man {
public void cut() {
System.out.println("动手术");
}
}
class Director extends Man {
@Override
public void cut() {
System.out.println("暂停");
}
}
class Hairdresser extends Man {
@Override
public void cut() {
System.out.println("剪头发");
}
}
多态访问成员的特点:
Father father = new Son()
左边类型 ————右边类型
成员变量:
1.编译时期看左边的类型,如果左边类型中没有变量,编译报错
2.运行时期看左边类型,左边类型的变量的值就是运行的结果
3.编译看左边,执行看左边
成员方法:
编译看左边,执行看右边
构造方法:
1.多态访问子类构造方法会先访问父类构造方法
2.帮助子类初始化父类继承过来的成员
静态方法:
编译看左边,执行看左边
举例代码如下:
public class DuoTaiDemo02 {
public static void main(String[] args) {
Fu fu = new Zi();
System.out.println(fu.num); // 10
fu.method();
fu.show();
}
}
class Fu {
int num = 10;
public void method() {
System.out.println("Fu.method()");
}
public static void show() {
System.out.println("Fu.show");
}
}
class Zi extends Fu {
int num = 20;
@Override
public void method() {
System.out.println("Zi.method()");
}
public static void show() {
System.out.println("Zi.show");
}
}
多态的优点
1.简化了代码
2.提高了维护性和扩展性
//饲养员给不同的动物喂不同的食物
public class DuoTaiDemo03 {
public static void main