00010 Instanceof的妙用——向下转型是有风险的(数据类型转换)

向下转型时是有风险的,可能会发生ClassCastException
因为这是一个运行时异常,不能被提前发现
我们想通过代码去避免ClassCastException,我们可以调用Instanceof来进行判断

语法格式:变量/对象 instanceof 类型, 结果要么是true,要么是false
什么情况下用instanceof判断,返回true?
if(p instanceof Woman) 当p中存储的就是Woman的对象
if(p instanceof Woman) 当p中存储的是Woman的子类的对象

package com.atguigu.test02.polymorphism;

public class TestCasting_Instanceeof {
	public static void main(String []args){
		ManC m=new ManC();
		test(m);
		
		WomanC w=new WomanC();
		test(w);
		
		WomanC w2 =new ChineseWoman();
		test(w2);
		
	}
	public static void test(PersonC p){
		//如果这个p是个女人,那么就调用它的shop方法,如果这个p是个男的,那么就调用它的smoke方法
		if (p instanceof WomanC) {
			WomanC w=(WomanC) p;
			w.shop();
		}
		else if(p instanceof ManC){
			ManC m=(ManC)p;
			m.smoke();
		}
	}
}

其中WomanC 、ManC、PersonC 这些是在一个包内另外的类里面已经写好了的,如果要调试,请在后面加上,或者在同一个包内新建一个类,参考如下:

package com.atguigu.test02.polymorphism;

public class TestCasting {
	public static void main(String[] args) {
		//(1)向上转型
		PersonC P0=new WomanC();//多态引用
		//p.eat();//这样写是错的,
		//一旦把WomanC对象向上转型为Person类型后,就只能调用父类的方法
		P0.eat();
		P0.walk();
		P0.sleep();
		//P0.shop();//这样写就是错的,一旦把WomanC对象向上转型为Person类型后,就只能调用父类的方法
		
		//-------------------------------------------
		//(2)向下转型
		//想调用WomanC特有的方法的时,编译时P0是PersonC类型,编译不通过,因为在Java中认为父类的概念范围>子类的概念范围
		long num =1L;
		int i=(int)num;
		
		double d=2.34;
		int i2=(int)d;
		
		double d2=(double)i2;
		
		//WomanC w=P0;//编译报错
		WomanC w=(WomanC)P0;//向下转型
		w.shop();//这样就能调用WomanC的特有方法了
		
		//调试
		PersonC p2=new PersonC();
		//WomanC w2=(WomanC)p2;//不能转换,ClassCastException:类型转换异常
		
		PersonC p3=new ManC();//向下转型
		//ManC m0=(ManC)p3;
		//m0.smoke();//这样就可以调用子类特有的方法啦
		//看一下错误的写法
		//WomanC w3=(WomanC)p3;//ClassCastException:类型转换异常
		//w3.shop();
		
		PersonC p4=new ChineseWoman();
		WomanC w4=(WomanC)p4;
		w4.shop();
		
		//不是父子类之间是不能进行转换的
/*		String p5="hellp";
		PersonC p6=(PersonC)p5;*/
		
		//PersonC p5="hellp";
		//PersonC p6=(PersonC)p5;
	}
}
class PersonC{
	public void eat(){
		System.out.println("吃饭");
	}
	public void walk(){
		System.out.println("走路");
	}
	public void sleep(){
		System.out.println("睡觉");
	}
}
class WomanC extends PersonC{
	public void eat(){
		System.out.println("细嚼慢咽的吃饭");
	}
	public void walk(){
		System.out.println("婀娜多姿的走路");
	}
	public void shop(){
		System.out.println("买买买");
	}
}
class ManC extends PersonC{
	public void eat(){
		System.out.println("狼吞虎咽的吃饭");
	}
	public void walk(){
		System.out.println("大摇大摆的走路");
	}
	public void smoke(){
		System.out.println("饭后一根烟,快乐做神仙");
	}
}
class ChineseWoman extends WomanC{
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值