Java类型-向上转型、向下转型与运行时类型识别(RTTI)

标签:

本文出自jvm123.com-java技术分享站:http://jvm123.com/2020/01/java-lei-xing-xiang.html

向上转型

向上转型:将导出类的引用转换为基类引用的动作

导出类即子类或实现类,基类也就是父类或接口。

eg:Animal 的子类 Cat,如下:

class Animal {
    void eat() {
    	// ...
    }
}

class Cat extends Animal {
    void eat() {
        // ...
    }
	void eatMore() {
        // ...
    }
}

public static void feed(Animal animal) {
    animal.eat();
}

public static void main(String args[]) {
    Cat cat = new Cat();
    feed(cat);
}

feed 方法可以接受Animal的引用,但是我们传递的是Cat的引用。Cat的引用被转换为Animal的引用,这个动作就是向上转型。

向下转型与运行时类型识别(RTTI)

向下转型,示例如下:

public static void main(String args[]) {
    Animal a1 = new Cat();
    Animal a2 = new Animal();
    // 如果调用eatMore()方法,就必须向下转型
    ((Cat)a1).eatMore();
    ((Cat)a2).eatMore(); // ClassCastException
}

调用eatMore()方法,就必须向下转型,使用小括号进行强制类型转换即可,这样代码在编译时就不会有问题。但是,在执行eatMore()方法时,会对a1、a2的类型进行检查,称为运行时类型识别(RTTI)。运行时,尝试将a1、a2转换为Cat,如果本来不是Cat类型,就会转换失败,返回一个ClassCastException。

发表评论