JAVA多态经典例题

Python09

JAVA多态经典例题,第1张

System.out.println("1--" + a1.show(b))

a1是A类引用指向A类对象,不存在多态,一定调用A类方法。A类方法有两个show(D)和show(A),b是B类引用无法转换为D类引用,但可以转换为A类引用,因此调用show(A),输出A and A。

System.out.println("2--" + a1.show(c))

输出A and A,原因同上。

System.out.println("3--" + a1.show(d))

调用show(D),输出A and D。

System.out.println("4--" + a2.show(b))

a2是A类引用指向B类对象,可能存在多态。b是B类引用无法转换为D类引用,但可以转换为A类引用,因此调用show(A),而B类重写了show(A),因此调用的是重写后的show(A),输出B and A。

System.out.println("5--" + a2.show(c))

同上,C类引用无法转换为D类引用,但可以转换为A类引用,因此调用show(A),输出B and A。

System.out.println("6--" + a2.show(d))

调用show(D),show(D)又调用父类即A类的show(D),输出A and D

System.out.println("7--" + b.show(b))

b是B类引用指向B类对象,不存在多态,一定调用B类方法。B类一共有三个方法:重写自A类的show(A)和show(D),以及新定义的show(B)。show(b)调用show(B)方法,输出B and B

System.out.println("8--" + b.show(c))

C类继承自B类,也调用show(B)方法,输出B and B

System.out.println("9--" + b.show(d))

调用show(D),show(D)又调用父类即A类的show(D),输出A and D

这只是隐式类型转换,Java中的多态一般是指函数重载(简而言之是同名函数不同参数实现相似功能)、InterfaceImplemention(即接口类)、抽象类、函数覆盖

类似于:

interface C {

    public abstract byte method(int i) // 4

}

abstract class B implements C {

    public abstract char method(int i, int j) // 5

    

    public void method(int i, Object obj) {} // 6

}

class A extends F { //原类

    //实现了父类所实现的接口的抽象函数

    @Override

    public byte method(int i) {...} // 1

    

    //实现了父类的抽象函数

    @Override

    public char method(int i, int j) {...} // 2

    

    //覆盖了父类的函数

    @Override

    public void method(int i, Object obj) {...} // 3

    

    //对于第二个和第三个的方法需要显示转换

    //例子:

    public static void main(String[] args)

    {

        B obj = new A()

        int x, y

        x = y = 0 // 初始化

        obj.method(x, y) //调用的是2号方法

        obj.method(x, (Object)y) //调用的是3号方法

        C objinterface = obj

        c.method(x) //调用的是1号方法

    }

}

实现多态的三个条件(前提条件,向上转型、向下转型)

1、继承的存在;(继承是多态的基础,没有继承就没有多态)

2、子类重写父类的方法。(多态下会调用子类重写后的方法)

3、父类引用变量指向子类对象。(涉及子类到父类的类型转换)

向上转型 Student person = new Student()

将一个父类的引用指向一个子类对象,成为向上转型,自动进行类型转换。此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法,而不是父类的方法此时通过父类引用变量无法调用子类特有的方法。

向下转型Student stu = (Student)person

将一个指向子类对象的引用赋给一个子类的引用,成为向下转型,此时必须进行强制类型转换。向下转型必须转换为父类引用指向的真实子类类型,,否则将出现ClassCastException,不是任意的强制转换

向下转型时可以结合使用instanceof运算符进行强制类型转换,比如出现转换异常---ClassCastException