
上QQ阅读APP看书,第一时间看更新
6.8 instanceof关键字
在Java中可以使用instanceof关键字判断一个对象到底是哪个类的实例,如格式6-7所示。

【例6.34】验证instanceof关键字的作用

程序执行结果:

上面的程序通过子类实例化的对象同时是子类和父类的实例,所以可以直接进行向上或向下转型,但如果直接使用了父类实例化本类对象,则一定就不再是子类实例了,所以是不能转换的。
在进行对象的向下转型关系之前最好先进行判断之后再进行相应的转换操作,这样可以避免类型转换异常的出现。
【例6.35】在向下转型前进行验证

程序执行结果:

在上面的fun()方法中,因为要调用各个子类自己的方法,所以必须进行对象的向下转型,但是为了保证程序在运行时不出现类转换异常,所以在发生向下转型之前要使用instanceof关键字判断是哪个子类的实例,以保证程序的运行正确。
说明
提问:这里的父类设计得不是很合理?
如果按照以上的方式编写代码,那么如果再增加子类的话则肯定要修改fun()方法,这样的类设计是不是很不合理呢?
回答:在类设计时永远不要去继承一个已经实现好的类。
会产生这个疑问本身是非常好的,那么读者现在思考一下,如果此时,在程序中将父类设计得足够合理的话,那是否还会产生这样的问题呢?所以,在类的设计中重点在于父类的设计,而且在类的设计中,永远不要去继承一个已经实现好的类,只能继承抽象类或实现接口,因为一旦发生对象的向上转型关系后,所调用的方法一定是被子类所覆写过的方法。