Java的强制类型转换,可以分成编译和运行两个阶段来分析。
    
    1.编译期间:
  • 被转型变量的编译时类型与目标类型相同;
  • 被转型变量的编译时类型是目标类型的父类;
  • 被转型变量的编译时类型是目标类型的子类,这种情况是自动向上转换。
    2.运行期间:
  • 被转型变量所引用的对象的实际类型必须是目标类型的实例,或者是目标类型的子类,实现类的实力,否则运行时将引发ClassCastException异常。
package com.raybin.classes;

public class ConversionTest
{
   public void conversion()
  {
    Object object = "Hello";
    
     //object变量的编译类型是Object,是String类型的父类
     //可以强制类型转换
     //而且object类型实际上引用的也是String,所以运行时也正常
    String objStr = (String)object;
    
     //objInt变量的编译类型是object,是String的父类
     //可以强制转换
     //但是objInt实际引用的是Integer对象
     //运行时引发ClassCastException异常
    Object objInt = new Integer(4);
    String str = (String)objInt;
    
     //strTmp的编译类型是String
     //而String不是Math的父类,也不是Math的子类
     //所以代码会导致编译出错
    String strTmp = "强制转换";
    Math math = (Math)strTmp;
  }
}

    instanceof的一个陷阱

    代码显示的结果是
    null是String的实例:false
    此处的string运行时并没有引用到一个实际的String对象,所以在代码会输出false。
    可以利用这个特性,告知一个引用是某种特定类型的实例,那么就可以肆无忌惮地安妥地将其转换成该类型,并调用该类型拥有的方法而不必担心会出现ClassCastException或者NullPointerException异常。

public void testInstanceof()
  {
    String string = null;
    System.out.println( "null是String的实例:"+(string instanceof String));
  }