文章目录
1.为什么需要多态?
面想对象的三大基本特点特点封装、继承、多态。下面通过一个例子说明为什么需要多态。比如单词cut,在医生口中的意思是动手术,在导演口中意思是暂停,在理发师口中意思是剪头发。
总结:生活中,同一个动作在不同环境下表现出来的不同状态;Java中: 同一个方法在不同的对象中体现出来不同的状态;内存中: 父类引用指向子类对象
多态的实现的必要条件:
- 1.存在继承关系
- 2.存在方法重写
- 3.父类引用指向子类对象
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("剪头发");
}
}
现在创建一个对象
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();
}
//运行结果为
动手术
暂停
剪头发
}
从一定角度来看,封装和继承几乎都是为多态而准备的。
2.多态访问成员的特点:
- 成员变量: 编译时期看左边的类型,如果左边类型中没有变量,编译报错
运行时期看左边类型,左边类型的变量的值就是运行的结果
编译看左边,执行看左边 - 成员方法:
编译看左边,执行看右边 - 构造方法:
多态访问子类构造方法会先访问父类构造方法
帮助子类初始化父类继承过来的成员 - 静态方法:
编译看左边,执行看左边
看对象:Fu fu = new Zi();
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");
}
}
创建一个子类对象 Zi
public class DuoTaiDemo02 {
public static void main(String[] args) {
Fu fu = new Zi();
System.out.println(fu.num); // 10
fu.method();//Zi.method()
fu.show();//Fu.show
}
}
3.多态的有点&例题
- 多态的优点
1.简化了代码
2.提高了维护性和扩展性
例子:需求: 饲养员给不同的动物喂不同的食物
//开闭原则: 对扩展开放,对修改关闭
class Feeder{
// 给老虎喂肉
// public void feedMeatToTiger(Meat m, Tiger t) {
// m.show();
// t.show();
// }
// 熊猫喂竹子
<