面向对象三大特性之多态

面向对象三大特性之多态

(本想自己写 但是发现一个更好的。)
抽象类的多态
场景描述
一位刚毕业的老师,目前只能通过骑车上班,多年后终于坐骑升级了,有了自己的小汽车,于是骑着小汽车上班。

骑自行车上班
1.自行车类

public class Bike{//自行车类
	public void start(){
		System.out.println("自行车-启动:握好把手,踩下脚踏板...");
	}
	public void stop(){
		System.out.println("自行车-停止:捏刹车...");
	}
}

2.教师类

public class Teacher {
	public void open(Bike bike) {
		bike.start();
	}
	
	public void close(Bike bike){
		Bike bike.stop();
	}
}

测试类

public class Test01 {
	public static void main(String[] args) {
		Teacher t = new Teacher();
		Bike bike = new bike();
		t.open(bike);
		System.out.println("欣赏沿途的风景...");
		t.close(bike);
	}
}

开小车上班
如果此时我们还是这样先去写一个小汽车类,然后在教师类里重载open和close方法,那么这样是不是会觉得代码冗余呢,有些朋友会说并没有,那当我们面对更多人,以及更多的上班方式时,那你是不是要分别为他们准备一套,那样未必太麻烦了,而且还会破坏OCP原则;这时,我们就可以用多态的方式完成这样,只需要提取一个交通工具类,然后当需求增加的时候我们直接扩充这个交通工具类就可以了。
OCP原则 - 开闭原则:需求改动,竟可能少影响原有代码

  • O - open :对创建类,是欢迎的
  • C - close:对原有代码进行修改,是拒绝的
  • p - principle:原则

Vehicle类(交通工具)

public abstract class Vehicle {
	
	public abstract void start();

	public abstract void stop();
}

Bike 类(自行车类)

public class Bike extends Vehicle{
	
	@Override
	public void start(){
		System.out.println("自行车-启动:握好把手,踩下脚踏板...");
	}
	
	@Override
	public void stop(){
		System.out.println("自行车-停止:捏刹车...");
	}

}

Car类(小汽车类)

public class Car extends Vehicle{

	@Override
	public void start(){
		System.out.println("小汽车-启动:系好安全带,一键启动,打转向灯,松手差,挂挡,踩油门");
	}
	
	@Override
	public void stop(){
		System.out.println("小汽车-停止:踩刹车,挂P档,拉手刹,关大灯,熄火,解开安全带");
	}
}

Teacher类(需求者类)

public class Teacher {
	
	public void open(Vehicle v) {
		v.start();
	}
	
	public void close(Vehicle v){
		v.stop();
	}
}

Test类(测试类)

public class Test01 {
	
	public static void main(String[] args) {
		Teacher t1 = new Teacher();
		//类的多态:子类对象指向父类引用
		//类的多态:父类引用存储了子类对象的内存地址
		Vehicle v = new Bike();
		
		t1.open(v);
		System.out.println("欣赏沿途的风景...");
		t1.close(v);
		System.out.println("...................");
		Teacher t2 = new Teacher();
		Vehicle vehicle = new Car();
		t2.open(vehicle);
		System.out.println("欣赏沿途的风景...");
		t2.close(vehicle);
	}
}

在我们升级后,如果需求增加时,比如有一个电动车的需求,那么我们的步骤就应该是,创建一个电动车的类去继承交通工具类,然后重写交通工具类的抽象方法。创建电动车对象指向父类引用,再交给给需求者使用便可。在这里同样是调用t.open(v);和t.close(v);这是结果就不一样的。这就是多态的结果,不同人都要上班,就一个上班的动作,而产生上班方式的结果不一样。

原文链接:https://blog.csdn.net/yigan123/article/details/106504556

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值