多态详解
2016-03-29 20:38
288 查看
父类引用指向子类的对象,进行动态绑定。不同的子类有不同的实现。
多态可以分为变量的多态,方法的多态,类的多态.我这里强调的是类的多态,这是我们在以后的工作中经常回用到的
首先,有这样一个系统:有个学生毕业了,做的还不错.买了辆捷达汽车.这个系统应该如何设计呢?
按照OO的思想,我们会抽象出来一个类,表示捷达汽车,其中有个run()方法
我们还会抽象出一个类,来代表人.其中有个drive()方法,需要一个汽车类型作为参数,我们先传入一个JD类型的参数
// 这是我们的核心业务类
如果你写出这样的代码的话,恭喜你!你中大奖了!———————你会被项目经理砍死的!!!!!!!
项目经理为什么会砍你呢?
因为你写的代码偶合性太强了!
如果我们的需求变了,这个学生后来更有钱了,买了一两Benz.那么我们以前的系统怎么办啊.不要指望你作的系统永远不会变化
我们的系统只能修改!这就是项目经理砍你的原因
我们的系统会增加一个Benz类,也有个run()方法
我们的核心业务类也要修改
以后的情况,我们可以把车抽象出来:
什么是多态?
简单的说:就是用基类的引用指向子类的对象
提问:多态可以用在什么地方呢?
回答:可以用在方法的参数中和方法的返回类型中
其中方法的参数楼上的兄弟已经给出了代码.我这里给出在方法的返回类型中如何使用多态
上面的例子中,不管是JD还是Benz都是我们自己直接new出来的.我们可以设计一个工厂类,专门生成汽车
/**
* 我们将多态使用在方法的返回类型中
* Car可以是抽象类,也可以是接口,JD和Benz分别继承该类或实现该借口
*/
这实际上就是设计模式中的简单工厂模式!
另外,我我们在JDK中可以大量的看到多态的应用,比如在
Object类中的equals(Object obj)方法中,参数是个Object
类型的参数.因为Object是Java中所有类的基类.,
但是才传入参数的时候,可以传入任何一个类的对象
这就是多态的应用!
使用多态可以解决项目中紧偶合的问题,提高程序的课扩展性.
是OCP(Open Closed Principle)原则的一个具体的实现。
多态可以分为变量的多态,方法的多态,类的多态.我这里强调的是类的多态,这是我们在以后的工作中经常回用到的
首先,有这样一个系统:有个学生毕业了,做的还不错.买了辆捷达汽车.这个系统应该如何设计呢?
按照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 B 4000 enz(); 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(Open Closed Principle)原则的一个具体的实现。
相关文章推荐
- Java编程手册-Collection框架(上)
- Building a Space Station(POJ_2031)
- HDU 3065 AC自动机模版题
- 八皇后问题两种基本解法
- CAS单点登录(SSO)完整教程
- 第五周项目一三角形类雏形5
- MongoDB -- 查询
- Mongodb 3.0 创建用户
- 一个正整数表示为n个连续正整数之和(第1届第2题)
- JNI学习笔记
- listView 选最后一个把前面的勾去掉,选择中间的把后面的去掉
- mysql 编码问题
- [python]多线程xpath爬虫
- HDU1312:Red and Black(DFS)
- 【opencv】光流法
- codevs 1183 泥泞的道路 二分+SPFA最长路
- 3.29学习记要
- SE Springer小组之《Spring音乐播放器》可行性研究报告五、六
- poj 1308 Is It A Tree?
- c++new失败处理