文档章节

面向对象之多态的理解

Jake_xun
 Jake_xun
发布于 2017/07/05 11:16
字数 1198
阅读 4
收藏 0

什么是多态?

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

多态存在的三个必要条件

1,要有继承

2,要有重写

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

多态的作用?

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

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

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

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

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()方法

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

View Code

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

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

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

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出来的.我们可以设计一个工厂类,专门生成武器

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原则的一个具体的实现

本文转载自:http://www.tuicool.com/articles/reUviiF

共有 人打赏支持
Jake_xun
粉丝 4
博文 55
码字总数 24233
作品 0
C++ —面向对象之多态的实现与应用

多态 大家应该都听过C++三大特性之一多态,那么什么多态呢?多态有什么用?通俗一点来讲-> 多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程...

Dawn_sf
2017/04/05
0
0
python面向对象OOP入门

一、面向对象简介 面向对象编程不是python独有,几乎所有高级语言都支持;面向对象不管在那个语言中都有三大特性:即:封装、继承、多态;具体的本文主要讲python面向对象--类及三大特性的具体...

dyc2005
2017/11/17
0
0
黑马程序员——面向对象篇之多态

------- android培训、java培训、期待与您交流! ---------- 多态 定义:某一类事物的多种存在形态。 例:动物中猫,狗。 猫这个对象对应的类型是猫类型 猫x = new 猫(); 同时猫也是动物中的...

optimisticpig
2014/04/17
0
0
JAVA多态的理解

面向对象的三大特性:封装、继承、多态,其中最难理解的就是多态 以下是网上某大神给的一个例子: 1.继承关系 class A { public String show(D obj){ return ("A and D"); } public String s...

小强零号
2015/09/23
482
0
面向对象的基本特征

面向对象方法具有三个基本特征: 封装:封装是将对象的实现细节隐藏起来,然后通过一些公共的方法来暴露该对象的功能。 继承:继承是面向对象实现软件复用的重要手段,当子类继承父类后,子类...

sunfish
2016/11/26
8
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

配置Spring的注解支持

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 配置Spring的注解支持 以上也提到了使用注解来配...

凯哥学堂
28分钟前
0
0
关于Spring Aop存在的一点问题的思考

在本人前面的文章Spring Aop原理之切点表达式解析中讲解了Spring是如何解析切点表达式的,在分析源码的时候,出现了如下将要讲述的问题,我认为是不合理的,后来本人单纯使用aspectj进行试验...

爱宝贝丶
29分钟前
0
0
JavaScript 概述

JavaScript是面向Web的编程语言。绝大多数现代网站都使用了JavaScript,并且所有的现代Web浏览器——基于桌面系统、游戏机、平板电脑和智能手机的浏览器——均包含了JavaScript解释器。这使得...

Mr_ET
今天
0
0
Java Run-Time Data Areas(Java运行时数据区/内存分配)

Java运行时数据区(内存分配) 本文转载官网 更多相关内容可查看官网 中文翻译可参考 2.5. Run-Time Data Areas The Java Virtual Machine defines various run-time data areas that are use...

lichuangnk
今天
0
0
docker learn :services docker-compose.yml

docker-compose.yml定义了服务的运行参数 version: "3" services: web: # replace username/repo:tag with your name and image details image: hub.c.163.com/dog948453219/friendlyhello d......

writeademo
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部