class A
{
 String s= "class:A";
}
class B extends A
{
 String s= "classB";
}
class TypeV{
 public static void main(String args[]){
 B b1,b2 = new B();
 A a1,a2;
 a1 = (A)b2;
 a2 = b2;
 System.out.println(a1.s);
 System.out.println(a2.s);
 b1 = (B)a1;
 System.out.println(b1.s);
}
}程序运行结果:
class : A
class : A
class : B不明白的是,为什么在a2 = b2这样的赋值时,b2不会把其对类B的引用复制给a2,a2仍然指向自己类型?我想像中的结果因该是
class : B
class : B
class : A

解决方案 »

  1.   

    我认为
    a1 = (A)b2;
    语句之后,b2就被强制类型转换为A类了
      

  2.   

    我们从程序中来看
    class A
    {
     String s= "class:A";
    }
    class B extends A
    {
     String s= "classB";
    }
    class TypeV{
     public static void main(String args[]){
     B b1,b2 = new B();
     A a1,a2;
     a1 = (A)b2;
     a2 = b2;
     System.out.println(a1.s);
     System.out.println(a2.s);
     b1 = (B)a1;
     System.out.println(b1.s);
    }
    }
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`
    a1 = (A)b2;   这句其实和 a1=b2 是一样的
    等价与 A a1=new b2();     其中 B b2=new B();
    class B extends A          B是A的子类, a1=b2是利用子类代替父类进行定义,不用强制类型转换.
    a2=b2同理。b1 = (B)a1;   这里a1是父类,b1是通过 B b1进行声明的,是子类,所以在用父类代替子类声明的时候必须进行强制类型转换,所以 (B)a1等价于 new B(new A);不知道你明白没.