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

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

什么是多态?为什么用多态?有什么好处?[转]相关推荐

  1. JAVA之旅(八)——多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例...

    JAVA之旅(八)--多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例 一.多态 我们今天又要学习一个新的概念了,就是多态,它是面向对象的第三个特征,何谓多态 ...

  2. C++静态多态(模版模拟多态)的讨论

    说到面向对象特性之一"多态",以我的水平已经说不出太多新意了.相信很多程序员代码K多了,做梦都在"多态中"运行着.常规的多态是C++语义内置支持的一种特性,通过 ...

  3. c++中的多态---1(多态概念,静态联编和动态联编,多态原理解析,重载,重写,重定义的对比)

    多态的基本概念 多态是面向对象设计语言数据抽象和继承之外的第三个基本特征 多态性(polymorphism)提供接口与具体实现之间的另一层隔膜,从而将"what"和"ho ...

  4. java 多态_Java面向对象 —— 多态

    前两天已经相继介绍了Java面向对象的三大特性之中的封装.继承,所以今天就介绍Java面向对象的三大特性的最后一项,多态~ 首先讲一下什么是多态,以及多态需要注意的细节 什么是多态:一个对象具备多种形 ...

  5. C++编译时多态和运行时多态

    C++编译时多态和运行时多态 作者:melonstreet 出处:https://www.cnblogs.com/QG-whz/p/5132745.html 本文版权归作者和博客园共有,欢迎转载,但未 ...

  6. c++ 多态 运行时多态和编译时多态_C++学习笔记之多态

    多态是面向对象三大特性之一 多态分为两类: 静态多态:函数重载 和 运算符重载 属于静态多态,复用函数名 动态多态:派生类 和 虚函数 实现运行时多态 静态多态和动态多态的区别: 静态多态的函数地址早 ...

  7. C++知识点 多态、静态多态、动态多态

    多态 有了继承才有多态的概念,首先说一下继承. 继承的概念是派生类可以调用基类的成员.常举的例子,动物是基类,它拥有所有动物共有的一些特征和方法.它会衍生出猫的类,狗的类,派生出的类除了有动物公共的特 ...

  8. java面向对象三大特性之多态---编译时多态和运行时多态详解

    一.引言 1.什么是多态? 说到重载和重写,大家可能都知道.它们都是多态性的体现,那么说什么是多态呢?多态是指允许不同子类型的对象对同一行为作出不同的响应.例如在生活中,比如跑的动作,小猫.小狗和大象 ...

  9. 多态的概念,多态的原理,多态解决什么问题

    目录 一.多态能解决什么问题 二.多态的概念 三,多态的原理 一.多态能解决什么问题 问题:通过基类指针只能访问派生类的成员变量,不能访问派生类的成员函数 (包括析构函数也不能访问)----(这也是为 ...

  10. C++ 多态(动态多态)

    本文结合黑马程序员.C语言中文网以及<C++ Primer>对多态进行了总结 多态的基本概念 多态是C++面向对象三大特性之一. 多态分为两类 静态多态: 函数重载 和 运算符重载属于静态 ...

最新文章

  1. http方式调用第三方接口
  2. 正点原子串口函数分析
  3. 关于Oracle Developer 的 DBMS_OUTPUT.PUT_LINE 输出问题
  4. 预留空间过大的OutOfMemoryError
  5. docker 删除映像_如何在Docker中删除映像和容器
  6. Netty服务端口的绑定
  7. 微信APP支付(基于Java实现微信APP支付)
  8. RecyclerView之自定义LayoutManager和SnapHelper
  9. 清华山维eps软件_这几款倾斜实景三维裸眼3D采集软件你了解吗?
  10. 怎么样学习Java?
  11. 网页内容监控 - 怎么才能做到网站内容实时推送百度?
  12. C# 使用DataMatrix.net.dll进行二维码打印
  13. 用VHDL编写testbench激励文件
  14. 费城交响乐团与上海爱乐乐团联合举行费城首届中国新年音乐会
  15. 区块链技术与应用实验报告(实验三)
  16. 三天流量有效期具体怎么算_飞猪流量有效期多久?怎么提取?
  17. 数据库设计学习②:数据库设计的步骤
  18. JLink的RTT调试
  19. 《数据挖掘概念与技术》学习笔记-第二章
  20. 产业分析:快手私域经营

热门文章

  1. 概率论:魏布斯分布Weibull cumulative distribution function
  2. Java 笔记-抽象类,接口
  3. 【520表白】C语言开发《浪漫流星雨》表白程序,源码来了!
  4. [UE4]Epic Games Launcher,Intall failed. code:0以及下载慢的问题
  5. 基恩士协议转换网关WTGNet-KV
  6. C#将数字自动翻译为中文
  7. usb声卡驱动(六):usb声卡中的pcm打开和关闭
  8. 2022最新网络安全基础知识点汇总
  9. 工作中常见的开会问题
  10. 查看linux ko内核版本,查看linux内核版本及操作系统版本的命令