Java基础篇---------多态

简单的讲一讲多态

多态思想:同一个行为具有多个不同表现形式或形态的能力。

前提条件:继承、重写、父类引用指向子类对象

基本语法:Parent p = new Child();

假如父类有五个子类,那么父类引用可以指向五个不同的子类(非同时指向五个),增加易读性和可维护性,降低内存占用。

下面展示一个有趣的小例子:

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 Test2
{
    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();

        // B继承A     C、D直接继承B

        // 引用变量是A,实例对象是A。传入的是b,那么A的show方法中符合的重载方法是show(A obj) 所            
        // 以结果显示的是A and A
        System.out.println("1--" + a1.show(b));

        // 引用变量是A,实例对象是A。传入的是c,那么A的show方法中符合的重载方法是show(A     
        // obj) 所以结果显示的是A and A
        System.out.println("2--" + a1.show(c));

        // 引用变量是A,实例对象是A。传入的是d,那么A的show方法中符合的重载方法是show(D obj) 
        // 所以结果显示的是A and D
        System.out.println("3--" + a1.show(d));

        // 引用变量是A,实例对象是B。传入的是b, 如果不加思考很容易觉得调用A的show(A obj),
        // 答案就是A and A。但是,实例对象是B,并且B是继承了A的类,并且B中只有show(B obj)这个方        
        // 法对应传入的b。所以,这题的答案是B and B么? 首先引用变量是A,类A中没有show(B obj) 
        // 所以类A无法访问子类特有的方法show(B obj),但是类A中有show(A obj)方法可以适用参数b, 
        // 单由于其实例对象为B,B继承了A并且重写了方法show(A obj),所以其实最终调用的是B的 
        // show(A obj)。答案是B and A
        System.out.println("4--" + a2.show(b));

        // 用变量是A,实例对象是B。 传入的是c,同理得答案是B and A
        System.out.println("5--" + a2.show(c));
        
        // 引用变量是A,实例对象是B。传入的是d,答案是A and D
        System.out.println("6--" + a2.show(d));

        // 引用变量是B,实例对象是B。传入的是b,答案是B and B
        System.out.println("7--" + b.show(b));

        // 引用变量是B,实例对象是B。传入的是c,答案是B and B
        System.out.println("8--" + b.show(c));

        // 引用变量是B,实例对象是B。传入的是d,答案是B and B。又错了,正确答案是A and D,因为子类可以调用父类的方法,所以最合适的不是B的show(B obj)方法而是A的show(D obj)方法。
        System.out.println("9--" + b.show(d));
    }
}

如果完全弄明白了上面的例子,那么对于继承和多台的使用和理解就合格了。

 

你可能感兴趣的:(JAVA基础)