当前位置: 首页 > news >正文

什么是多态?为什么用多态?有什么好处?[转]

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

首先,有这样一个系统:有个学生工作从达内毕业了,作的还不错.买了辆捷达汽车.这个系统应该如何设计呢?
按照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原则的一个具体的实现

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ssyyll/archive/2008/10/28/3170405.aspx

相关文章:

  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • phpmyadmin中数据显示奇怪字符解决办法
  • Windows 7 公共文件夹对话框
  • NVIDIA发布首个基于AI的癌症分布式学习环境的框架——CANDLE
  • 谈谈创业和梦想
  • 无人驾驶背后的技术 - PostGIS点云(pointcloud)应用 - 2
  • C语言封送结构体数组
  • vue双向绑定原理
  • ul 下的li 添加背景
  • Net Standard扩展支持实例分享
  • Seam开发环境中的中文乱码问题
  • bootstrap学习-初步使用介绍
  • 思科认证规划
  • 《精通Spring MVC 4》——1.7 错误与转码配置
  • 图解思科网院学生注册流程
  • 「译」Node.js Streams 基础
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • Javascript弹出层-初探
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 后端_ThinkPHP5
  • 来,膜拜下android roadmap,强大的执行力
  • 前端
  • 如何选择开源的机器学习框架?
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 协程
  • 原生 js 实现移动端 Touch 滑动反弹
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ###C语言程序设计-----C语言学习(6)#
  • #{} 和 ${}区别
  • #微信小程序:微信小程序常见的配置传旨
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (js)循环条件满足时终止循环
  • (八)c52学习之旅-中断实验
  • (二)JAVA使用POI操作excel
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (数据结构)顺序表的定义
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转)【Hibernate总结系列】使用举例
  • .net FrameWork简介,数组,枚举
  • .Net 中Partitioner static与dynamic的性能对比
  • .NET学习全景图
  • @Bean注解详解
  • @Service注解让spring找到你的Service bean
  • [android] 切换界面的通用处理