Java 语言的多态性机制导致了引用变量的声明类型和其实际引用对象的类型可能不一致,在结合虚方法调用规则可以得出下述结论:声明为同种类型的两个引用变量调用同一个方法时,也可能会有不同的行为。
为更准确的鉴别一个对象的真正类型,语言引入了instanceof  java 操作符,其使用格式为:<引用类型变量>instanceof<引用类型> 这是 boolean 类型的表达式,当 instanceof 左侧的引用类型所引用的对象的实际类型是其右侧给出的类型或其子类类型时,整个表达式的结果为 true,反之为 false。
案例名称:instanceof 关键字的使用
程序名称:InstanceOfTest.java 
class Person2 extends Object{}
class Student2 extends Person2{}
class Worker extends Person2{}
public class InstanceOfTest {
  public void method(Person2 e) {
    if (e instanceof Person2) {
         System.out.println("this is Students");
    } else if (e instanceof Worker) {
         System.out.println("this is Worker");
    } else {
         System.out.println("this is a Person");
    }
 }
  public static void main(String[] args) {
     InstanceOfTest t=new InstanceOfTest();
     Worker w=new Worker(); t.method(w);
  }
}
程序解释:InstanceOfTest 类的 method1 方法,根据传入的不同对象确定调用不同的语句,java 基本类型的相互转换,包括自动类型转换和强制类型转换机制,java 引用类型数据也存 在类似的机制。
1 ○默认类型转换:子类类型的数据可以直接赋值给父类类型的引用变量。
2 ○强制类型转换:也称为对象造型,父类类型的数据可以被强制转换为其子类的类型。造型 的语法格式为:(子类类型)父类类型数据,使用方法如程序 CastingTest.java 所示。
案例名称:强制类型转换 程序名称:
CastingTest.java 
class Person3{ String name; }
class Student3 extends Person3{
  String school="pku";
  public String getSchool(){
  return school;
  }
}
public class CastingTest {
 public void method(Person3 e) {
  //System.out.println(e.getSchool());//非法
  if(e instanceof Student3){
  Student3 me=(Student3)e;
  System.out.println(me.getSchool());
 }
}
public static void main(String[] args) {
  CastingTest t=new CastingTest();
  Student3 m=new Student3(); t.method(m);
  }
}
 程序解释:语句 t.method(m)中的m是 Student3 的实例,method 方法的参数 “method Person3e) ( ” 因此吗赋值给了 Person3 声明的变量。因此方法 getSchool()没有在父类 Person3 中定义,因此不能直接调用,使用前需要竞夺强制转换。
强制转换是还需要注意一次额问题:
无继承关系的引用类型间的转换是非法的,编译时会出错;
并不是任意的父类类型数据都可以被造型为子类类型,在造型前可以使用 instanceof 操 作符测试一个对象的类型,以避免运行是出错。