在这里我创建了一个父类A一个子类B
分别尝试了四种组合AA,AB,BB,BA。(第一个字母表示引用的类型,第二个字母表示实际类型)
- class A{
- public void method1(){
- System.out.println("class"+this.getClass().getSimpleName()+":method1");
- }
- }
- class B extends A{
- public void method1(){
- System.out.println("class"+this.getClass().getSimpleName()+":method1");
- }
- }
- public class xx{
- public static void main(String[]args){
- //第一种情况
- A realA=new A();
- realA.method1();
- //B referenceB1=(B)realA;//错误,realA的实际类型是A,不能强制转换为B引用类型。否则抛出ClassCastException
- //第二种情况
- A referenceArealB=new B();
- B referenceB2=(B)referenceArealB;//强制转换成功
- referenceB2.method1();
- //第三种情况
- B referenceBrealB=new B();
- A ReferenceA1=(A)referenceBrealB;//强制转换成功
- ReferenceA1.method1();
- //第四种情况
- B referenceBrealA=(B)new A();//错误
- }
- }
- /* 总结:
- * 注意必须得是继承层次当中进行类型转换
- * 在引用的时候只能允许父类引用子类的对象,也就是说引用的级别必须得比实际对象的级别高(当然可以同级),否则不能编译通过。
- * 在强制转化的时候,被强制转化的目标类型要比要低实际类型要高(当然也可以同级),否则会抛出异常classCastException
- *
- * */