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