Chinaunix首页 | 论坛 | 博客
  • 博客访问: 491359
  • 博文数量: 74
  • 博客积分: 750
  • 博客等级: 军士长
  • 技术积分: 1453
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-29 15:59
文章分类
文章存档

2014年(30)

2013年(8)

2012年(36)

分类: C/C++

2012-09-26 10:46:09

多态可以分为变量的多态,方法的多态,类的多态.我这里强调的是类的多态,这是我们在以后的工作中经常回用到的 

首先,有这样一个系统:有个学生工作从达内毕业了,作的还不错.买了辆捷达汽车.这个系统应该如何设计呢? 
按照OO的思想,我们会抽象出来一个类,表示捷达汽车,其中有个run()方法 
public class JD{ 
public void run(){ 
System.out.println("JD在以120迈的速度在run"); 


我们还会抽象出一个类,来代表人.其中有个drive()方法,需要一个汽车类型作为参数,我们先传入一个JD类型的参数 

// 这是我们的核心业务类 
public class Person{ 
public void drive(JD jd){ 
jd.run(); 


public static void main(String args[]){ 
Person p =new Person(); 
JD jd = new JD(); 
p.drive(jd); 



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

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

如果我们的需求变了,这个学生后来更有钱了,买了一两Benz.那么我们以前的系统怎么办啊.不要指望你作的系统永远不会变化 
我们的系统只能修改!这就是项目经理砍你的原因 
我们的系统会增加一个Benz类,也有个run()方法 

public class Benz{ 
public void run(){ 
System.out.println("Benz在以200迈的速度在run"); 



我们的核心业务类也要修改 

public class Person{ 

/* 
public void drive(JD jd){ 
jd.run(); 

*/ 

public void drive(Benz b){ 
b.run(); 


public static void main(String args[]){ 
Person p =new Person(); 
Benz b = new Benz(); 
p.drive(b); 



以后的情况,我们可以把车抽象出来: 
public abstract class Driver{ 
/*属性*/ 
public void run();//让子类来运行 


public Benz extends Driver{ 
public void run(){ 
System.out.println("Benz在以200迈的速度在run"); 


public JD extends Driver{ 
public void run(){ 
System.out.println("JD is running..."); 



public class Person{ 
private Driver driver; 
public Person(){ 


public Person(Driver driver){ 
this.driver = driver; 

public void drive(){ 
driver.run(); 

public void setDriver(Driver driver){//运用参数多态,以后不管买什么车都可以 
this.driver = driver; 



public static void main(String args[]){ 
Person p =new Person(); 
JD jd = new JD();//刚开始没钱就买辆JD吧 
p.setDriver(jd); 
p.driver(); 
Benz benz = new Benz{();//有钱换车了 
p.setDriver(benz); 
p.driver(); 



什么是多态? 
简单的说:就是用基类的引用指向之类的对象 

提问:多态可以用在什么地方呢? 
回答:可以用在方法的参数中和方法的返回类型中 

其中方法的参数楼上的兄弟已经给出了代码.我这里给出在方法的返回类型中如何使用多态 

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

/** 
* 我们将多态使用在方法的返回类型中 
* Car可以是抽象类,也可以是接口,JD和Benz分别继承该类或实现该借口 
*/ 
public class CarFactory{ 
public Car factory(String carName){ 
if(carName.equals("JD")){ 
return new JD(); 
}else if(carName.equals("Benz")){ 
return new Benz(); 
}else{ 
System.out.println("对比起,不伺候"); 
return null; 




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

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

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

使用多态可以解决项目中紧偶合的问题,提高程序的课扩展性.是OCP原则的一个具体的实现
阅读(1117) | 评论(1) | 转发(0) |
0

上一篇:函数重载问题

下一篇:多态

给主人留下些什么吧!~~

一鸣雨2012-09-26 13:43:11