多态可以分为变量的多态,方法的多态,类的多态.我这里强调的是类的多态,这是在以后的工作中经常会用到的。多态的表现形式有方法重载,方法改写,多态变量和泛型。重载是一种静态的多态性,在程序编译时确定被调用的方法,称为早绑定。而多态变量和改写相结合之后,方法的调用在运行时才能确定,是动态的多态性,称为晚绑定。
首先,有这样一个系统:有个学生从兰理工毕业了,做得还不错.买了辆捷达汽车.这个系统应该如何设计呢?
按照面向对象的思想,我们会抽象出来一个类,表示捷达汽车,其中有个run()方法
public class JD{我们还会抽象出一个类,来代表人.其中有个drive()方法,需要一个汽车类型作为参数,我们先传入一个JD类型的参数
public void run(){
System.out.println("JD在以120迈的速度在run");
}
}
// <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();}}哈哈,童靴们仔细体会一下多态的好处吧!!!