多态

多态:就是某一类事物的多种存在形态。

使用多态的前提是:类与类之间有关系,要么是继承关系,要么是实现。

多态体现在:父类的引用指向了子类的对象,而且也可以接收自己的子类对象。

我们来看一个简单的多态应用练习题,来深入的理解多态。

现在有两种班级,一个是基础班,一个是高级班,用多态体现出来。

首先对这两类进行共同的特点抽取

基础班学生和高级班学生他们都是学生 这个大类的,都具有学习这个基本的功能,而且都需要睡觉。

那我们单独的将学生提取为一个类。

abstract class Student

 {

    abstract void study();

    public void sleep()  

  {

       System.out.println("zzzzzzzz");  

  }

 }

将学习定义为一个抽象方法,是因为基础班和高级班学习的内容是不同的,但是他们都具备学习这个特性,那么我们定义为抽象方法,在子类中进行复写。

来定义两个子类

class BaseStudent extends Student

 {

   public void study()

   {  

     System.out.println("basestudy");

    }

   public void sleep()  

  {  

     System.out.println("huhuhu");

   }

}

class AdvStudent extends Student

{

   public void study()

   {   

    System.out.println("adv study");

    }

}

BaseStuden类 和AdvStudent类都继承了student类,是student类的两个子类,我们发现两个子类都对study()方法进行了复写,拥有各自的具体功能。在这里,我也将BaseStudent类的sleep()方法覆盖了,定义了自己的功能。

OK继承完成,那么我们接下来写主函数了?

要运行BaseStudent 类和AdvStudent类中的方法,我们就要建立这 两个类的对象,通过对象来调用方法。

好吧,写吧!

class DuoTaiUse

{

  public static void main(String[]args)

    {

      BaseStudent bs = new BaseStudent();

      bs.study();

      bs.sleep();

      AdvStudent as = new AdvStudent();

      as.study();

      as.sleep();

  }

}

发现了主函数中有需多重复的代码,调用的方法都是一样的,那么我们能否将这部分代码提取出来,形成一个单独的类,给出一个对外的调用方法呢?

class Do

 {

   public void dosomething(Student stu)

   {

    stu.study();  

    stu.sleep();

     } 

}

我们将主函数改为

class DuoTaiUse

{

   public static void main(String[]args)

  {

    Do d= new Do();

    d.dosomething(new BaseStudent());

    d.dosomething(new AdvStudent()); 

  }

}

来看看执行过程:

主函数运行:Do d= new Do();创建Do类的一个对象,Do类加载进内存。继续运行, d.dosomething(new BaseStudent()); 我们发现,会有一个  Student stu=new BaseStudent(),stu是父类的引用,现在指向子类BaseStudent,运行dosomething()方法,那么就是在运行BaseStudent类中的study()方法和sleep()方法,同理,我们运行d.dosomething(new AdvStudent()); 就是在运行AdvStudent类中的 study()方法和sleep()方法。这就是父类的引用指向子类对象,提高了代码的复用性。

在这段代码中,我们抽取的Student类和Do类都是发现的共同特点所提取出来单独成类的。

那么我现在再加入一个新增的速成班呢?

也是可以的,先定义这个类,

class SuChengStudent extends Student

{

   public void study()

   { }

   public void sleep()  

  {  }

}

在主函数中只需要加入,

d.dosomething(new SuChengStudent());

比起之前,应用性和修改上都有很大的改观,因此,多态也大大的提高了程序的扩展性。

 

 

 

 

 

posted @ 2012-02-26 21:45  Timmy-1988  阅读(159)  评论(0编辑  收藏  举报