多态典型例子

来源:互联网 发布:明解c语言pdf百度云 编辑:程序博客网 时间:2024/05/21 22:45

我们先来谈谈一个多态静态方法重写的例子:

package classfileStaticcover;class A{    public static void test()    {        System.out.println("be cover ");    }}class B extends A{    public static void test()    {        System.out.println("cover");    }}public class StatiCover{    public static void main(String[] args)    {        A a_and_b = new B();        a_and_b.test();    }}

上面的代码输出的是父类test()方法里面的字符串。

再来看看一段代码,这段代码也是我今天看到了,觉得比较有用就拿来分析多态典型的例子:

package classfile;class A{    public String show(D obj)    {        return ("A and D");    }    public String show(A obj)    {        return ("A and A");    }}class B extends A{    public String show(B obj)    {        return ("B and B");    }    public String show(A obj)    {        return("B and A");    }}class C extends B{}class D extends B{}public class TypiucalTest{    public static void main(String[] args)    {        A a1 = new A();        A a2 = new B();        B b = new B();        C c = new C();        D d = new D();        System.out.println(a1.show(b));        System.out.println(a1.show(c));        System.out.println(a1.show(d));        System.out.println(a2.show(b));        System.out.println(a2.show(c));        System.out.println(a2.show(d));        System.out.println(b.show(b));        System.out.println(b.show(c));        System.out.println(b.show(d));    }}

输出结果如下面:
这里写图片描述

前面三个输出估计没有问题,接下来说明一下第四个,首先a2是A类的引用变量,它所指向的对象是B类的对象,可以看出这就是多态的特性,a2.show(b);计算机的执行过程为:首先到父类中寻找show(B obj)这个方法,但是发现找不到,于是找到形参为A定义的show(A obj)这个函数,把b赋值给a,在这一步上又有出现多态的特性,此时按理来说是输出的“A and A”,但是不然,因为show(A obj)这个函数被子类B重写了所以说要调用子类中的show(A obj)这个函数,以上三步是执行全过程,由此可以看出,多态特性中用父类变量调用成员方法是通过子类对象来调用的,所以最后一步调用了子类重写父类的成员方法。有些书上总结了一些公式,但我觉得这种问题还是要从解析内存上理解,后面的几个也差不多。

1 0
原创粉丝点击