instanceof关键字
在Java中可以使用instanceof关键字判断一个对象到底是哪个类的实例,格式如下:
对象 instanceof 类——>返回 Boolean 类型;
【验证instanceof关键字的作用】
class A
{
public void fun1(){
System.out.println("A--》public void fun1()");
}
public void fun2(){
this.fun1();
}
}
class B extends A
{
public void fun1(){
System.out.println("B-->public void fun2()");
}
public void fun3(){
System.out.println("B-->public void fun3()");
}
}
public class InstanceofDemo
{
public static void main(String[] args){
A a1=new B();//向上转型
System.out.println("A a1=new B():"+(a1 instanceof A));
System.out.println("A a1=new B():"+(a1 instanceof B));
A a2=new A();//通过A类中的构造方法实例化本类对象
System.out.println("A a2=new B():"+(a2 instanceof A));
System.out.println("A a2=new B():"+(a2 instanceof B));
}
}
运行结果为:
A a1=new B():true
A a1=new B():true
A a2=new B():true
A a2=new B():false
从以上程序发现,通过子类实例化的对象同时也是子类和父类的实例,所以可以直接进行向上或者向下转型,但是如果直接使用了父类实例化本类对象,则一定就不在是子类实例了,所以还是不能转型的。在进行对象的向下转型前最好进行判断在进行相应操作。
【在向下转型前进行验证】
class A
{
public void fun1(){
System.out.println("A-->public void fun1()");
}
public void fun2(){
this.fun1();
}
}
class B extends A
{
//覆写A中的方法
public void fun1(){
System.out.println("B-->public void fun1()");
}
//子类中自己定义的方法
public void fun3(){
System.out.println("B-->poublic void fun3()");
}
}
class C extends A
{
public void fun1(){
System.out.println("C-->public void fun1()");
}
public void fun5(){
System.out.println("C-->public void fun3()");
}
}
public class PolDemo04
{
public static void main(String[] args){
fun(new B());//传递B类实例,产生向上转型
fun(new C());//传递C类实例,产生向上转型
}
public static void fun(A a){//接收父类对象
a.fun1();
if(a instanceof B){
B b=(B)a;//向下转型
b.fun3();//调用子类自己定义的方法
}
if(a instanceof C){
C c=(C)a;//向下转型
c.fun5();//调用子类自己定义的方法
}
}
}
运行结果:
B-->public void fun1()
B-->poublic void fun3()
C-->public void fun1()
C-->public void fun3()
在上面的fun()方法中因为要调用各个子类自己的方法,所以必须进行对象的向下转型,但是为了保证程序进行时不出现转型异常,所以在发生转型时进行检验,以保证程序的运行正常。