【小白日记】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();
}
posted @ 2019-05-04 16:04  李维昊  阅读(500)  评论(0编辑  收藏  举报