向下转型 instanceof


向下转型 instanceof


//有了对象的多态性以后,内存总实际上是加载了子类特有的属性 方法的  但是由于变量声明为父类类型,导致编译时,只能调用父类中声明的属性
		//方法。子类特有的属性和方法不能调用。
		
		//如何才能调用子类特有的属性和方法?
		//洗向下转型 使用强制类型转化符
		Man m1 = (Man)p2;
		m1.earnMoney();
		m1.isSmoking = true;
		//使用强转时 可能出现 ClassCastException异常
/*		Woman w1 = (Woman)p2;
		p2.shopping();		*/
		
		/*
		 * instanceof 关键字的使用
		 * a instanceof A : 判断对对象a是否是类A的实例  如果是返回true  如果不是 返回false
		 * 
		 * 
		 * 使用情景  为了避免向下转型时出现ClassCastException的异常,则先进行instanceof的判断,一旦返回true则进行向下转型
		 * 如果返回false  则终止向下转型
		 * 
		 * 如果 a instanceof A返回true  则 a instanceof B 也返回true
		 * 其中 类B 是 类A的父类
		 */
		if (p2 instanceof Woman) {
			Woman w1 = (Woman)p2;
			 w1.goShopping();
			System.out.println("******Woman**********");
		}
		if(p2 instanceof Man) {
			Man m2 = (Man)p2;
			m2.earnMoney();
			System.out.println("**********Man*************");
		}
		if(p2 instanceof Person) {
			System.out.println("*******Person*********");
		}
		if(p2 instanceof Object) {
			System.out.println("*******Object*********");
		}
		
		//练习:
		//问题1:编译通过 运行不通过
/*		Person p3 = new Woman();
		Man m3 = (Man)p3;		*/
		
/*		Person p4 = new Person();
		Man m4 = (Man)p4;		*/ //错误 因为new的是Person,此并内有利用多态性
		
		//问题2:编译通过,运行也通过
		Object obj = new Woman();
		Person p = (Person)obj;
		
		//问题3;编译不过 运行不过
	/*	Man m5 = new Woman();	*/
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值