重载,重写以及继承,多态

继承是子类获得父类的成员重写是继承后重新实现父类的方法。 重载是在一个类里一系列参数不同名字相同的方法。 多态则是用基类的引用指向子类的对象。
        网上看到一个有趣的说法是:继承是子类使用父类的方法,而多态则是父类使用子类的方法。
下面的例子包含了这四种实现:
class Triangle extends Shape {
      public int getSides() {
             return 3;
      }

}
class Rectangle extends Shape {
      public int getSides(int i) {
            return i;
      }

}
public class Shape {
      public boolean isSharp(){
             return true;
       }
       public int getSides(){
             return 0 ;
       }
      public int getSides(Triangle tri){
            return 3 ;
      }
      public int getSides(Rectangle rec){
            return 4 ;
      }

     public static void main(String[] args) {
            Triangle tri = new Triangle();
            System.out.println("Triangle is a type of sharp? " + tri.isSharp());

            Shape shape = new Triangle();
            System.out.println("My shape has " + shape.getSides() + " sides.");

      }
}
红色是重载绿色是重写蓝色是继承粉红是多态
注意Triangle类的方法是重写,而Rectangle类的方法是重载。

比较红色的和粉红的部分就可以发现多态对重载的优点:如果用重载,则在父类里要对应每一个子类都重载一个取得边数的方法;如果用多态,则父类只提供取得边数的接口,至于取得哪个形状的边数,怎样取得,在子类里各自实现(重写)。

 

什么是多态?为什么用多态?有什么好处?

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

 

转载于:https://my.oschina.net/u/590763/blog/69985

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值