面向对象之多态的理解

什么是多态?

简单的说,就是用父类的引用指向子类的对象。多态可以理解成“一个接口,多种实现”,就是同一种事物表现出的多种形态,多态允许将子类的对象当作父类的对象使用,某父类型的引用指向其子类型的对象,调用的方法是该子类型的方法。

多态存在的三个必要条件

1,要有继承

2,要有重写

3,父类引用指向子类对象

多态的作用?

把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。

看下面的例子,程序员还是比较喜欢用代码来说明问题

举个例子,针对中国军人打日本鬼子这件事,用我们程序来实现的话就是这样:

假如现在是1900年,中华民族的军人是用大刀来杀敌的,按照OO的思想,我们会抽象出来两个个类,一个表示大刀,一个表示军人,即军人用大刀杀敌;其中,武器有个kill()方法,表示杀日本鬼子,军人有个方法是用大刀来战斗。我们的实现方式是这样:

05114625_ci96.gif

public class Sword {
	public void kill() {
		System.out.println("大刀向日本鬼子的头上砍去!");
	}
}
public class Soldier {
	public void fight(Sword sword) {
		sword.kill();
	}
	public static void main(String args[]) {
		Soldier soldier = new Soldier();
		Sword sword = new Sword();
		soldier.fight(sword);
	}
}

View Code

如果你写出这样的代码的话,恭喜你!你中大奖了!---------------------你会被项目经理砍死的!!!!!!!

项目经理为什么会砍你呢?因为你写的代码偶合性太强了!

想一想,

如果我们的需求变了,日本鬼子1939年又来侵略中国了,那么我们的战士该怎么办啊,总不能像以前一样拿着大刀跟人家打仗吧,那样的话抗日战争会不会到现在还没结束呢?!

所以到我们程序这儿,以前的系统怎么办啊.因此不要指望你作的系统永远不会变化

我们的系统只能修改!这就是项目经理砍你的原因

我们的系统会增加一个枪支类,也有个kill()方法

05114625_ci96.gif

public class Gun{
    public void kill(){
           System.out.println("把子弹射入日本鬼子的头颅!");
    }
}

View Code

我们的核心业务类Soldier也要升级

05114625_ci96.gif

public class Soldier {
	/*
	   public void fight(Sword sword){ 
				sword.kill(); 
			}
	 */
	public void fight(Gun gun) {
		gun.kill();
	}
	public static void main(String args[]) {
		Soldier soldier = new Soldier();
		// Sword sword= new Sword ();
		// soldier.fight(sword);
		Gun gun = new Gun();
		soldier.fight(gun);
	}
}

View Code

这样做是不是耦合性太强了?以后的情况,我们可以把大刀和枪等作为武器抽象出来:

05114625_ci96.gif

public abstract class Weapon {
	public void kill();// 让子类来运行
}
public Sword extends Weapon{
	@Override
	public void kill() {
		System.out.println("大刀向日本鬼子的头上砍去!");
	}
}
public Gun extends Weapon{
	@Override
	public void kill() {
		System.out.println("把子弹射入日本鬼子的头颅!);
	}
}
public class Soldier {
	private Weapon weapon;
	public Soldier(){}
	public Soldier(Weapon weapon){
		this.weapon = weapon;
	}
	public void setWeapon(Weapon weapon){
		this.weapon = weapon;
	}
	public void fight() {
		weapon.kill();
	}
	public static void main(String args[]) {
		Soldier soldier = new Soldier();
		Weapon sword= new Sword ();
		soldier.setWeapon(sword);
		soldier.fight();//1900年用大刀杀敌
		Weapon gun = new Gun();
		soldier.setWeapon(gun);
		soldier.fight();//1939年用小米加步枪杀敌
	}
}

View Code

多态可以用在什么地方呢?

可以用在方法的参数中和方法的返回类型中。

其中多态用于方法参数时上面给出了代码.我这里给出在方法的返回类型中如何使用多态。

上面的例子中,不管是Sword还是Gun都是我们自己直接new出来的.我们可以设计一个工厂类,专门生成武器

05114625_ci96.gif

public class WeaponFactory {
	public Weapon createWeapon(String year) {
		if (year.equals("1900")) {
			return new Sword();
		} else if (year.equals("1939")) {
			return new Gun();
		} else {
			return null;
		}
	}
}
public class Soldier {
	private Weapon weapon;
	public Soldier(){}
	public Soldier(Weapon weapon){
		this.weapon = weapon;
	}
	public void setWeapon(Weapon weapon){
		this.weapon = weapon;
	}
	public void fight() {
		weapon.kill();
	}
	public static void main(String args[]) {
		Soldier soldier = new Soldier();
		WeaponFactory weaponFactory = new WeaponFactory();
		Weapon sword= weaponFactory.createWeapon("1900");
		soldier.setWeapon(sword);
		soldier.fight();//1900年用大刀杀敌
		Weapon gun= weaponFactory.createWeapon("1939");
		soldier.setWeapon(gun);
		soldier.fight();//1939年用小米加步枪杀敌
	}
}

View Code

这实际上就是设计模式中的简单工厂模式!

另外,我我们在JDK中可以大量的看到多态的应用,比如在Object类中的equals(Object obj)方法中,参数是个Object

类型的参数.因为Object是Java中所有类的基类.,但是才传入参数的时候,可以传入任何一个类的对象这就是多态的应用!

使用多态可以解决项目中紧偶合的问题,提高程序的课扩展性.是OCP原则的一个具体的实现

转载于:https://my.oschina.net/u/3293292/blog/1162462

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值