【超经典】Java多态有什么好处?怎样用?

时间:2023-02-09 16:18:53

多态可以分为变量的多态,方法的多态,类的多态.我这里强调的是类的多态,这是在以后的工作中经常会用到的。多态的表现形式有方法重载,方法改写,多态变量和泛型。重载是一种静态的多态性,在程序编译时确定被调用的方法,称为早绑定。而多态变量和改写相结合之后,方法的调用在运行时才能确定,是动态的多态性,称为晚绑定。

首先,有这样一个系统:有个学生从兰理工毕业了,做得还不错.买了辆捷达汽车.这个系统应该如何设计呢?
按照面向对象的思想,我们会抽象出来一个类,表示捷达汽车,其中有个run()方法
public class JD{
public void run(){
System.out.println("JD在以120迈的速度在run");
}
}
我们还会抽象出一个类,来代表人.其中有个drive()方法,需要一个汽车类型作为参数,我们先传入一个JD类型的参数
// <strong><span style="color:#ff0000;">这是我们的核心业务类</span></strong>
public class Person{
public void <span style="color:#ff0000;">drive(JD jd)</span>{ <span style="color:#ff0000;">//写死了类型,修改麻烦</span>
jd.run();
}

public static void main(String args[]){
Person p =new Person();
JD jd = new JD();
<span style="color:#ff0000;"> p.drive(jd); //只能传入JD类型
</span> }
}
如果你写出这样的代码的话,恭喜你! 你完蛋了-------------项目经理会有砍死你的冲动!!!!!!!
项目经理为什么会砍你呢? ---------因为你写的 代码偶合性太强了!
 
如果我们的需求变了,这个学生后来更有钱了,买了一两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.drive();   Benz benz = new Benz{();//有钱换车了   p.setDriver(benz);   p.drive();}}
哈哈,童靴们仔细体会一下多态的好处吧!!!