Java面对对象特性之----多态
一、什么是多态
面对对象编程三大特性:封装、继承、多态
多态 是指不同类的对象对同一消息作出不同的响应
二、多态的作用
- 消除类型之间的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
- 简化性
三、多态存在的三个条件
- 有继承关系
- 子类重写父类方法
- 父类引用指向子类对象
注: 第二点中父类的三种类型方法不能表现为多态:
- 1、static修饰的方法,因为被static修饰的方法是属于类的,而不是属于实例的
- 2、final修饰的方法,因为被final修饰的方法无法被子类重写
- 3、private和protected修饰的方法,前者是因为被private修饰的方法对子类不可见,后者是因为尽管被protected修饰的方法可以被子类见到,也可以被子类重写,但是无法被外部所引用
四、实例解析
模拟一个简单的场景:水有三种状态(固态、液态、气态),三种状态都有自己各自的方法,现模拟水的不同状态来杀死小强
①: 创建一个 H2O 接口
public interface H2O {
public void kill(); //有一个杀死小强的方法
}
②: 创建水三种状态的实现类,分别继承 H2O 接口
(1)液态 Liquid
public class Liquid implements H2O{
@Override
public void kill() {
System.out.println("淹死");
}
public void wash(){ //液态水可以洗衣服
System.out.println("可以洗衣服");
}
}
(2)固态 Solid
public class Solid implements H2O{
@Override
public void kill() {
System.out.println("压死");
}
public void downTemp(){ //冰可以降温
System.out.println("可以用来降温");
}
}
(3)气态 Gaseity
public class Gaseity implements H2O{
@Override
public void kill() {
System.out.println("烫死");
}
public void heat(){ //水蒸气可以加热食品
System.out.println("加热食品");
}
}
③: 创建一个People类,使用水的各种方法
public class People {
private H2O tool;
private String target;
public Pepple(H2o tool,String target){
this.tool = tool;
this.target = target;
}
public void execute(){ //调用父类共有的方法kill
tool.kill();
System.out.println("目标:"+target);
}
public void use(){ //父类引用指向子类对象
if (tool instanceof Liquid){
((Water)tool).wash();
}else if (tool instanceof Solid){
((Ice) tool).downTemp();
}else{
((Steam)tool).heat();
}
}
}
④: 创建一个测试类 H2OTest
public class H2OTest {
public static H2O getH2OByTemp(int temp){ //通过温度判断水的状态,从而生成相应的实体类
H2O h2O = null;
if(temp <= 0){
h2O = new Solid();
}else if(temp < 100){
h2O = new Liquid();
}else{
h2O = new Gaseity();
}
return h2O;
}
//测试
public static void main(String[] args) {
H2O tool= getH2OByTemp(200);
People people = new People(tool,"小强");
people.execute();
people.use();
}
}
/* 控制台打印:
烫死
目标:小强
加热食品
*/