Java学习(十七)

Java多态的学习差不多有3个小时,老师还夹杂着一些编译器运用的知识。
这是多态的基本知识:

我们可以创建父类引用指向子类对象,这就是多态的一种。(这种也叫向下转型)

Pet c=new Cat();//Pet是父类,Cat是子类
c.eat();

这样的话,如果Pet中有一个eat()的方法就会编译通过,否则会编译报错,因为该引用是Pet类型的。(静态绑定,编译阶段的绑定)
编译成功后会运行,需要Cat中有一个eat()类,否则会运行报错,因为该引用指向的对象是Cat。(动态绑定,运行阶段的绑定)
如果再加一行代码:
Dog d=(Dog)c;//把c强制转换成Dog类型
就会发生运行阶段的报错java.lang.ClassCastException(类型转换异常,总在向下转型时发生),因为JVM堆内存中c指向的对象是Cat,Cat对象不能转换成Dog对象,两种之间没有任何继承关系,所以会报错。
为了避免这种情况,我们可以使用instanceof运算符。
用法是
引用 instanceof 数据类型名
返回值是bool类型。
实践在最后。
这是多态的作用

以前c++学多态的时候,就学的一个virtual,听得挺迷糊的,看了什么静态、动态绑定也不知道是什么意思,只会用。学了Java中的多态后,两相印证,现在清楚多了。
写代码用多态拓展起来确实会方便很多。
最后我实践了一下

package duotai;

public class Main {
    public static void main(String[] args){
        Valoran kk=new Valoran();
        Demacia gai=new Demacia();
        Knox nuo=new Knox();
        kk.shuo(gai);
        kk.shuo(nuo);
        if(gai instanceof Demacia)
        {
            System.out.println("盖伦是德玛西亚人");
        }
        else
        {
            System.out.println("盖伦出错啦");
        }
        if(nuo instanceof Knox)
        {
            System.out.println("诺手是诺克萨斯人");
        }
        else
        {
            System.out.println("诺手出错啦");
        }
    }
}

这是写的几个类,就不具体放上来了。

运行结果:

posted @ 2020-07-04 00:03  hqk111  阅读(103)  评论(0编辑  收藏  举报