使用instanceof的场景
首先先要明确Java中存在编译时类型和运行时类型,比如
Object obj = new String("xiaoysec");
其中,obj编译时类型是Object类型的,运行时也就是实际的类型是String类型的,在Java中,一个父类引用指向子类对象,并调用重写的方法就可以实现多态的效果,父类引用指向一个子类对象,这个是系统自动就完成那个的向下转型,也规定了在这种情况下父类引用只能调用父类中定义的方法而不能调用子类中定义的方法,否则会报错
那么如果父类引用一定要调用子类中定义方法,就需要将父类引用进行转型,这种称之为强制转型
强制转型
接上面的例子,Object obj = new String("xiaoysec"); ,
obj实际的类型是String类型的,编译时类型是Object,需要进行转型才能调用String类型的特有方法,需要知道这种转型的条件:
- 首先编译时类型和运行时类型需要存在继承关系
在上面的例子中Object类型和String类型存在继承关系,可以进行转型,上例中如果父类对象的运行时类型也就是实际的类型是Object,进行强转是会报错的
** String str = (String)obj;** 完成转型,这个时候就可以调用String类型的方法了
instanceof的引出
instanceof的出现可以说是为了程序的健壮性,因为如果出现了类型转换不能进行的情况,就会报错,使用instanceof就可以判断是否可以转换成功,这样保证的程序的健壮性
instanceof的注意点
- A instancef B 首先A的类型是有其运行时类型也就是真是类型决定的
- 当A是B(一个类或者接口)的实例,子类实例,接口实现类实例的时候就返回true