zoukankan      html  css  js  c++  java
  • JAVA多态

    多态是指当系统A访问系统B的服务时,系统B可以通过多种方式来提供服务,而这一切对系统A是透明的.比如动物园的饲养员能够给各种各样的动物喂食.下图显示了饲养员Feeder,食物Food和动物Animal及它的子类的类框图.

    可以把Feeder,Animal和Food都看成独立的子系统.Feeder类的定义如下:

    public class Feeder{

       public void feed(Animal animal,Food food){

             animal.eat(food);

              }

          }

    以下程序演示了一个饲养员分别给一只狗喂肉和猫喂鱼.

    Feeder feeder=new Feeder();

    Animal animal=new Dog();

    Food food=new Bone();

    feeder.feed(animal,food);//给dog喂肉

    animal=new Cat();

    food=new Fish();

    feeder.feed(animal,food);//给cat喂鱼

    以上animal变量被定义为Aniaml类型,但实际上有可能引用Dog或Cat的实咧.在Feeder类的feed()方法中调用animal.eat()方法,Java虚拟机会执行animal变量所引用的实咧的eat()方法.可见animal变量有多种状态,一会儿是猫,一会儿是狗,这个就是多态的字母含义.

    Java语音允许某个类型的引用变量引用子类的实咧,而且可以对这个引用变量进行类型转换.

    Animal animal=new Dog();

    Dog dog=(Dog)animal;

    Creature creature=animal;

    如果把引用变量转换为子类类型,则称为向下转型,如果把引用变量转换为父类类型,则称为向上转型.在进行引用变量的转换时,会受到各种静态属性,静态方法,实烈方法,以及从父类中继承的方法和属性时,Java虚拟机会采用不同的绑定机制.

    通过具体的例子来演示多态的各种特性.在下图中父类Base和子类Sub中都定义了实例变量var,实例方法method(),静态变量staticVar和静态方法staticMethod(),此外,在Sub类中还定义了实例变量subVar和subMethod().

    Sub.java:

     package poly;

    class Base{

        String var="BaseVar";//实例变量

        static String staticVar="StaticBaseVar";//静态变量

        void method(){     //实例方法

          System.out.println("Base method");

    }

        static void staticMethod(){  //静态方法

          System.out.println("Static Base method");

                 }

            }

          public class Sub extends Base{

               String var="SubVar";   //实例变量

               static  String staticVar="StaticSubVar';  // 静态变量

                void method(){  //覆盖父类的method()方法

                  System.out.println("Sub method");

    }

          static void staticMethod(){         //隐藏父类的staticMethod()方法

              Syatem.out.println("Static Sub method");

    }

               String subVar="Var only belonging to Sub";

            void subMethod(){

              System.out.println("Method only belonging to Sub");

    }

             public static void main(String args[]){

                    Base who=new Sub();     //who被声明为Base类型,引用Sub实例

                    System.out.println("who.var="+who.var);   //打印Base类的var变量

                    System.out.println("who.staticVar="+who.staticVar); //打印Base类的staticVar变量

                   who.method();   //打印Sub实例的method()方法

                    who.staticMethod();     //打印Base类的staticMethod()方法

                     }

           }

    今天先写这么多,请多多指教.

  • 相关阅读:
    67. @Transactional的类注入失败【从零开始学Spring Boot】
    66. No EntityManager with actual transaction available for current thread【从零开始学】
    Android ShapeDrawable之OvalShape、RectShape、PaintDrawable、ArcShape
    Android渲染器Shader:环状放射渐变渲染器RadialGradient(三)
    Android渲染器Shader:梯度渐变扫描渲染器SweepGradient(二)
    Android弹幕编程设计实现的解决方案(一)
    65.什么是IOC?【从零开始学Spring Boot】
    64.JPA命名策略【从零开始学Spring Boot】
    事务、视图和索引
    存储过程
  • 原文地址:https://www.cnblogs.com/cuntouyixiaohuo/p/5965030.html
Copyright © 2011-2022 走看看