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()方法

                 }

       }

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

原文地址:https://www.cnblogs.com/cuntouyixiaohuo/p/5965030.html