多态典型例子

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

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));
    }


}

输出结果如下面:
多态典型例子_第1张图片

前面三个输出估计没有问题,接下来说明一下第四个,首先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)这个函数,以上三步是执行全过程,由此可以看出,多态特性中用父类变量调用成员方法是通过子类对象来调用的,所以最后一步调用了子类重写父类的成员方法。有些书上总结了一些公式,但我觉得这种问题还是要从解析内存上理解,后面的几个也差不多。

你可能感兴趣的:(java初学,多态,class)