zoukankan      html  css  js  c++  java
  • 什么是多态?为什么用多态?有什么好处?

    多态可以分为变量的多态,方法的多态,类的多态.我这里强调的是类的多态,这是我们在以后的工作中经常回用到的
    首先,有这样一个系统:有个学生工作从达内毕业了,作的还不错.买了辆捷达汽车.这个系统应该如何设计呢?
    按照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原则的一个具体的实现

    本文转自:http://www.cnblogs.com/lihaozy/archive/2010/11/05/1869511.html

    工欲善其事,必先利其器。
  • 相关阅读:
    一、ZooKeeper学习
    Winform下有关控件焦点问题
    一、人工智能概述
    二十五、过滤器Filter,监听器Listener,拦截器Interceptor的区别
    二十四、JAVA的NIO和IO的区别
    四、触发器(Trigger)
    三、存储过程(Stored Procedure)与游标(Cursor)
    二十三、Spring框架的相关知识点总结
    《构建之法》阅读笔记第十&十一章
    《构建之法》阅读笔记
  • 原文地址:https://www.cnblogs.com/zhangzhu/p/2495024.html
Copyright © 2011-2022 走看看