【小白日记】Java 多态中的两种类型转换
为什么需要类型转换
接之前代码示例说
当我们创建一种动物时
这种动物不可能只会吃东西一种方法。他们都会有自己的特定的属性及方法
例如狗会玩游戏 猫会抓老鼠
而这些方法因为是该宠物独有的 所以我们需要把这些方法编写到子类当中
但是一经这样编写 当我们尝试在构造成多态的主方法当中直接调用时会发生如下结果
package com.sky.study;
public class Test2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Pet p = new Dog();
p.eat();
p.play(); //报错,多态当中无法直接访问子类当中独有的方法或属性
}
}
如果尝试运行会发现
Exception in thread “main” java.lang.Error: Unresolved compilation problem:
The method play() is undefined for the type Pet
at com.sky.study.Test2.main(Test2.java:9)
这是因为上面所提到的 多态当中无法直接调用子类当中独有的属性或者方法。
这时候我们的类型转换就可以很愉快的帮助我们了。
两种类型转换
向上转型
向上转型也叫自动类型转换,是构成多态的方式,也就是之前所说的构成多态的语法格式
- 父类类型 引用名称 = new 子类类名();
- 当是多态时,该引用名称只能访问父类中的属性和方法,但是优先访问子类重写以后的方法
向下转型
向下转型也叫做强制类型转换
- 当是多态时,并且访问子类独有的属性或方法时,则必须进行向下转型
举个例子吧
public static void main(String[] args) {
// TODO Auto-generated method stub
Pet p = new Dog();
p.eat();
//p.play(); //报错,多态当中无法直接访问子类当中独有的方法或属性
Dog d =(Dog)p;
d.play();
- 当进行向下转型时,建议先进行判断,当合法则在转为对应的类型,则使用instanceof关键字,否则可能会出现类型转换异常java.lang.ClassCastException
if(p instanceof Dog){
Dog d = (Dog)p;
d.play();
}
else if(p instanceof Cat){
Cat c = (Cat)p
c.play();
}