为什么需要有多态?
多态的概述
生活中:
一个动作在不同的环境下表现出来的不同状态
代码中
同一个方法在不同的类下体现出来的不同的实现
内存中
父类引用指向子类对象
多态在代码中如何来实现?
1.必须要存在继承关系
2.必须存在方法重写
3.父类引用指向子类对象
package com.sxt;
public class DouTai {
public static void main(String[] args) {
CutBoy b = new Barber();
b.cut();
b = new Doctor();
b.cut();
b = new Director();
b.cut();
}
}
class CutBoy {
public void cut() {
System.out.println("想怎么cut就怎么cut");
}
}
class Barber extends CutBoy {
public void cut() {
System.out.println("剪头发");
}
}
class Doctor extends CutBoy {
public void cut() {
System.out.println("动手术");
}
}
class Director extends CutBoy {
public void cut() {
System.out.println("暂停");
}
}
多态访问成员的特点:
成员变量:编译时期看左边类型,运行时期看左边类型
成员方法:编译时期看左边类型,运行时期看右边类型
构造方法:帮助子类初始化父类继承过来的成员
静态方法:编译时期看左边类型,运行时期看左边类型
package com.sxt.duotaidemo;
public class DuoTaiDemo02 {
public static void main(String[] args) {
Fu fu = new Zi();
System.out.println(fu.num);
fu.method();
// fu.staticMethod();
Fu.staticMethod();
Zi.staticMethod();
}
}
class Fu {
int num = 5;
public Fu() {
super();
}
public void method() {
System.out.println("Fu.method()");
}
public Fu(int num) {
super();
this.num = num;
}
public static void staticMethod() {
System.out.println("Fu.staticMethod()");
}
}
class Zi extends Fu {
int num = 10;
public Zi() {
super();
}
@Override
public void method() {
System.out.println("Zi.method");
}
public static void staticMethod() {
System.out.println("Zi.staticMethod()");
}
}
多态的优点:
1.简化了代码
2.提高了维护性和扩展性
开闭原则:对扩展开放,对修改关闭
package com.sxt;
/*
* 饲养员给不同的动物喂不同的食物
*/
public class DuoTaiDemo02 {
public static void main(String[] args) {
Feeder f = new Feeder();
// f.feedMeatToTiger(new Tiger(), new Meat());
//
// f.feedBambooToPanda(new Panda(), new Bamboo());
Animal an = new Tiger();
Food food = new Meat();
f.feed(an, food);
f.feed(new Monkey(), new Banana());
}
}
//开闭原则: 对扩展开放,对修改关闭
class Feeder{
// 给老虎喂肉
/*
* 返回值类型: void
* 参数列表: Tiger t, Meat m
* 方法名: feedMeatToTiger
*/
/*public void feedMeatToTiger(Tiger t, Meat m) {
t.show();
m.show();
}
public void feedBambooToPanda(Panda p, Bamboo b) {
p.s