黑马程序员_java面向对象——多态

时间:2022-12-28 15:42:23
------- android培训java培训、期待与您交流! ----------

java面向对象——多态

一、  多态的概念。

多态是面向对象程序设计三大特性之一。是指面向对象程序运行时,相同的信息可能会送给多个不同的类型之对象,而系统可依据对象所属类型,引发对应类型的方法,而有不同的行为。简单来说,所谓多态意指相同的信息给予不同的对象会引发不同的动作称之。

多态的前提是继承或都实现。换句话说,没有了继承和实现,多态就无从说起。

二、 抽象类实现多态的举例。

例一:

像机的用途是用来拍照。但是在不同年代相机的拍照功能是不同的。如七八十年代的想机图像存放的地方是胶卷,而现代的相机图像存放的地方内存卡。它的实现都各不相同,查看所拍照的照片也各不相同。我们开发才能使同样的硬件实应不同的时代呢。用java类实现以上描绘。如下:

//相机类

abstract class Camera

{

      public abstract void photoGraph();//不同年代的相机有不同的拍照方式

      public abstract void storage();//不同年代有不同的照片存储方式。

      public abstract void seePhoto();//不同年代的相机查看照片的方式不同。

}

class OddCamera extends Camera//以前的相机

{

      public void photoGraph()

      {

             System.out.println("老的相机拍照后拉胶卷");

      }

      public void storage()

      {

             System.out.println("照片暴光存储在胶卷中");

      }

      public void seePhoto()

      {

             System.out.println("把一卷胶卷拍完后,取出来洗就可以看了");

      }

}

class NowCamera extends Camera//现代相机

{

      public void photoGraph()

      {

             System.out.println("现代的相机拍照直接按拍照按钮");

      }

      public void storage()

      {

             System.out.println("现代相机拍照后,把信息存储在存储卡中");

      }

      public void seePhoto()

      {

             System.out.println("按预览键就可以在相机屏幕上查看照片");

      }

}

class FutrueCamera extends Camera//未来相机

{

      public void photoGraph()

      {

             System.out.println("未来的相机拍照是相机自动识别");

      }

      public void storage()

      {

             System.out.println("未来相机拍照后,把信息发送到互联网上共享");

      }

      public void seePhoto()

      {

             System.out.println("在电脑上查看照片");

      }

}

class DuTaiClientDemo

{

      public static void main(String[] args)

{

      Camera c=null;

      //以前的相机

      System.out.println("-----------------老相机--------------------");

      c=new OddCamera();

      c.photoGraph();

      c.storage();

      c.seePhoto();

      

      //现代相机

      System.out.println("-----------------现代相机--------------------");

      c=new NowCamera();

      c.photoGraph();

      c.storage();

      c.seePhoto();

      

      //未来的相机

      System.out.println("-----------------未来相机--------------------");

      c=new FutrueCamera();

      c.photoGraph();

      c.storage();

      c.seePhoto();

 

}

}

程序运行结果:

-----------------老相机--------------------

老的相机拍照后拉胶卷

照片暴光存储在胶卷中

把一卷胶卷拍完后,取出来洗就可以看了

-----------------现代相机--------------------

现代的相机拍照直接按拍照按钮

现代相机拍照后,把信息存储在存储卡中

按预览键就可以在相机屏幕上查看照片

-----------------未来相机--------------------

未来的相机拍照是相机自动识别

未来相机拍照后,把信息发送到互联网上共享

在电脑上查看照片

 

实例一所示,同样的一个相机对象c有老相机的状态,现代相机的状态,未来相机的状态。这就是多态的表现。

实例二:

      我们还可以生产一个象相适配器,当像相随着时代的进步而不会被淘汰。有了适配器,我们只要把现代相关的技术装上去就可以了。代码如下:

class AdapterCamera

{

      public void adapter(Camera c,String CameraType)

      {

             System.out.println("-----------------"+CameraType+"--------------------");

             c.photoGraph();

             c.storage();

             c.seePhoto();

 

      }

}

class DuTaiClientDemo

{

      public static void main(String[] args)

      {

             AdapterCamera ap=new AdapterCamera();

             Camera oddCamera=new OddCamera();

             Camera nowCamera=new NowCamera();

             Camera futureCamera=new FutrueCamera();

             ap.adapter(oddCamera,"老相机");

             ap.adapter(nowCamera,"现代相机");

             ap.adapter(futureCamera,"未来相机");

      }

}

我们再来看看,适配器中也用到了多态。利用了多态,我们就可以实现了代码的复用,简化了代码的数量,降底了代码的藕合度。使程序易于扩展。

      上面的适配器里是不是什么都可以传呢,不是的,只能传递的类型是Camera类型的。传其他类型装发生无法转换的异常。如:

class DuTaiClientDemo

{

      public static void main(String[] args)

      {

             AdapterCamera ap=new AdapterCamera();

             Camera oddCamera=new OddCamera();

             Camera nowCamera=new NowCamera();

             Camera futureCamera=new FutrueCamera();

             ap.adapter(oddCamera,"老相机");

             ap.adapter(nowCamera,"现代相机");

             ap.adapter(new Object(),"未来相机");

      }

}

我们new了一个Object类型的过去,程序编译时发生异常。如下:

 

G:\studyjava>javac DuoTaiDemo.java

DuoTaiDemo.java:96:无法将 AdapterCamera中的 adapter(Camera,java.lang.String)

应用于 (java.lang.Object,java.lang.String)

               ap.adapter(new Object(),"未来相机");

                 ^

1错误

对于种情况,我们就需要使java关键字(instanceof)进行判断,如果是Camera类行时才执行,否则报错。代码如下:

class AdapterCamera

{

      public void adapter(Camera c,String CameraType)

      {

             if(c instanceof Camera)

             {

                    System.out.println("-----------------"+CameraType+"--------------------");

                    c.photoGraph();

                    c.storage();

                    c.seePhoto();

             }

             else

             {

                    System.out.println("不是相机类型");

             }

      }

}

 

三、       接口实现多态的实例。

例一:我们在公共场所经常看到“非工作人员勿进”,我们就用java语言来描述这一句话。如下:

//工作人员。

interface IWorker//工作人员

{

           public void credentials();//工作证件

           public void work();//工作

}

class WorkHome//工作室

{

           public void door(IWorker worker)

           {

             worker.credentials();

             worker.work();

           }

}

//实现了张三这个工作者

class ZhangShan implements IWorker

{

           public void credentials()

           {

             System.out.println("张三带上自己的工作证");

           }

           public void work()

           {

             System.out.println("张三在工作中.........");

           }

}

//实现了李四这个工作者

class LiShi implements IWorker

{

           public void credentials()

           {

             System.out.println("李四带上自己的工作证");

           }

           public void work()

           {

             System.out.println("李四在工作中.........");

           }

}

//实现了王五这个工作者

class WangWu implements IWorker

{

           public void credentials()

           {

             System.out.println("王五带上自己的工作证");

           }

           public void work()

           {

             System.out.println("王五在工作中.........");

           }

}

class InterfaceWorkHomeDemo

{

           public static void main(String[] args)

           {

             WorkHome workhome=new WorkHome();

             ZhangShan z=new ZhangShan();

             LiShi l=new LiShi();

             WangWu w=new WangWu();

             workhome.door(z);

             workhome.door(l);

             workhome.door(w);

           }

}

结果输入为:

张三带上自己的工作证

张三在工作中.........

李四带上自己的工作证

李四在工作中.........

王五带上自己的工作证

王五在工作中.........

 

工作室的类的door传入的参数是接口Iworker类型。让其实现接口的子类以参数传递过来。这就是利用了多态的结。不能型态对应着不周的方法,从而有不周的表现。

四、       使用多态主意的事项。

1)基实多态就是通过继承父类,然后在子类中重写父类的非私有方法。然后在把子类赋值给父类(类型自动提升)然后父类调用的方法,就是子类实现的方法,如此来实现多态。

2)多态的前提必须有继承。没有继承关系,就无从谈起。

3)在继承并重写或覆盖父类的方法时,子类传入的参数可以被缩小(类型本身或其子类型)

4)在继承并重写或覆盖父类的方法时,返回类型可以被放大(类型本身或其父类)

5)子类不能重写父类的私有成员方法,即使定义了,也只说明是重新在子类中定义一个新方法而已。

6)重写或覆盖父类的方法时,如果父类的方法带有返回值,子类也一定带有返回值。

7)重写或覆盖父类的方法时,如果父类的方法抛出异常,那么子类要么声明为异常本身、子类或没有。如果父类方法没有抛出异常,那么子类不得抛出任何异常。

8)子类不能重写父类用final悠饰的的方法。

9)子类不能继承至用final修饰的类。因为此种类不能被继承。