java 类型检查_Java开发对象类型检查详细解析

原标题:Java开发对象类型检查详细解析

14c811b74d6a230b56a693802e440b99.png

前面介绍了类的多态性,来自于鸡类的实例chicken,既能用来表达公鸡实例,也能用来表达母鸡实例。可是这导致了一个问题,假如在call方法内部需要手工判断输入参数属于公鸡实例还是母鸡实例,那该如何是好?所谓“雄兔脚扑朔,雌兔眼迷离,双兔傍地走,安能辨我是雄雌”,固然编译器在运行之时能够自动判断这是哪种鸡,可是若让程序员自己辨别倒的确是件伤脑筋的事情。虽说伤脑筋,却也并非无法实现,粗略算来大致有三个办法能派上用场,接下来分别进行阐述。

第一个办法,区别公鸡和母鸡,关键在于识别鸡的性别。注意到Chicken鸡类刚好有个性别类型字段sex,在公鸡类中sex固定为0,在母鸡类中sex固定为1。于是通过检查chicken实例的sex属性取值,即可判断该实例属于公鸡类还是属于母鸡类。据此可编写实例类型的鉴别方法,具体代码如下:

// 通过属性字段type检查某实例的归属类

private static void checkType(Chicken chicken) {

if (chicken.sex == 0) { // 判断性别是否为雄性

System.out.println("检查类型字段:这是只公鸡。");

} else if (chicken.sex == 1) { // 判断性别是否为雌性

System.out.println("检查类型字段:这是只母鸡。");

} else {

System.out.println("检查类型字段:这既不是公鸡也不是母鸡。");

}

}

通过性别类型鉴定归属类,这种做法虽然在理论上可行,但事实上并不可靠。因为要是公鸡实例的sex取值被意外篡改为1,那该公鸡实例岂不是被误判为母鸡了?好比一只公鸡做了变性手术,难道它就变成母鸡了吗?篡改只能改变局部特征,并不能改变该事物的内在本质,或者说,血液中流淌着的基因是无法改变的。只要DNA里面携带Y染色体,那么这只鸡从根本上说就是公鸡,而不管它外表上如何整形。

由此可见,依据基因检测,才是检查实例类型的可靠办法。在Java代码中,获取某实例基因的手段是调用该实例的getClass方法,一旦获得某只鸡的基因,再跟公鸡的基因和母鸡的基因去比较,分分钟就比较出结果了。对于公鸡类Cock来说,它的基因可通过Cock.class提取;对于母鸡类Hen来说,它的基因可通过Hen.class来提取。于是实例类型的鉴别过程便分解为两个步骤:先调用实例的getClass方法得到它的基因,再将该基因与目标基因进行匹配操作,倘若匹配成功则表示二者是同一种类型。下面是按照基因匹配来检查实例归属类的代码例子:

// 通过类的基因检查某实例的归属类

private static void checkClass(Chicken chicken) {

if (chicken.getClass().equals(Cock.class)) { // 判断这只鸡的DNA是不是公鸡DNA

System.out.println("检查对象的类名:这是只公鸡。");

} else if (chicken.getClass().equals(Hen.class)) { // 判断这只鸡的DNA是不是母鸡DNA

System.out.println("检查对象的类名:这是只母鸡。");

} else {

System.out.println("检查对象的类名:这既不是公鸡也不是母鸡。");

}

}

上述的基因检测手段很好很强大,然而其缺点也很明显,就是太专业太啰嗦了。本来仅仅是个判断实例类型的小事,何必要搞得兴师动众、追根溯源呢?因此Java专门提供了一个类型检查的关键字instanceof,使用格式形如“A instanceof B”,意思是检查A实例是否属于B类型,该表达式返回true表示属于,返回false表示不属于。这样关于鸡类实例的类型判断,借助于新关键字instanceof,又有了第三个鉴别办法,详细的鉴别代码如下所示:

// 利用关键字instanceof检查某实例的归属类

private static void checkInstance(Chicken chicken) {

if (chicken instanceof Cock) { // 判断这只鸡是不是公鸡

System.out.println("检查对象实例:这是只公鸡。");

} else if (chicken instanceof Hen) { // 判断这只鸡是不是母鸡

System.out.println("检查对象实例:这是只母鸡。");

} else {

System.out.println("检查对象实例:这既不是公鸡也不是母鸡。");

}

}

可见利用instanceof判断实例的类型,不但简化了代码的写法,而且看起来也更易懂了。返回搜狐,查看更多

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值