a1=(ATest)b2,a2=b2,b1=(BTest)a1 强制类型转换
把a1强制转换成 ATest类型来处理

解决方案 »

  1.   

    a1,a2是ATest类型的变量,就象String str;一样
    a1=(ATest)b2是指将对象b2转化成ATest类型后赋给a1,此时b2已经是ATest类型;所以a2=b2就是指将b2赋给a2,此时它们的类型一致;因为b1是类BTest的对象,所以要想将a1赋给b1必须进行类型转换b1=(BTest)a1该程序运行的结果为:
    class:Atest
    class:Atest
    class:Btest
      

  2.   

    因为BTest是从ATest继承而来,BTest的对象就是ATest的对象,所以,从b2到a1到转换可以省去强制类型转换,即
    a1 = b2;
    而a1本身是父类对象,所以,转成子类对象需要强制转换。在Java中,reference其实只是一个别名。
    你用a1的reference指向类b2,所以,它就成了b2这个对象的别名,所以不用new也可以!可以尝试了解Liskov替换原则,对于继承关系到解释是最棒的。
    Robert Martin的《敏捷软件开发》有关于LSP的详细讲解。
      

  3.   

    对于junxi() 的回答,我还有点疑问,你的意思是不是说如果这个时候我写下面的语句:System.out.println(b2.s);的话,就要输出class:A了啊
    还有,我想问一下,如果没有a1=(ATest)b2;  a2=b2; b1=(BTest)a1;的话,会怎么样呢?对DreamHead的回答,我不了解什么是reference,还有这里没有类b2 啊,不知道能不能给我在详细地解释一下,我对你的“在Java中,reference其实只是一个别名。
    你用a1的reference指向类b2,所以,它就成了b2这个对象的别名,所以不用new也可以!

    还是不懂,谢谢!!
      

  4.   

    刚才在解释a2=b2的时候,解释错了,应该是这样的,因为BTest是从ATest继承而来,BTest的对象就是ATest的对象,所以,从b2到a1到转换可以省去强制类型转换,即
    a1 = b2;a2=b2
      

  5.   

    而ATest是BTest的父类,所以要把ATest的对象赋给BTest的对象的时候,必须进行类型转换!!~~~~~~~
      

  6.   

    你的意思就是说当要用到父类对象时,可以用子类的对象来代替,是吗?
    还有,我刚刚提出的问题,希望你也能帮我解答一下:“如果这个时候我写下面的语句:System.out.println(b2.s);的话,就要输出class:A了啊
    还有,我想问一下,如果没有a1=(ATest)b2;  a2=b2; b1=(BTest)a1;的话,会怎么样呢?”
      

  7.   

    我改了程序了,想不明白才来题问的啊
    我现在就是想知道,既然b2已经赋给了a1,那么,调用a1.s时,为什么还是出现了class.ATest;
    这时的a1,不是变成b1了吗
      

  8.   

    System.out.println(b2.s);
    输出:class:Btest
    如果没有a1=(ATest)b2;  a2=b2; b1=(BTest)a1
    程序调试的时候有3个错你自己调一下就知道了
      

  9.   

    想明白了,谢谢各位的帮助,特别要感谢junxi的帮助!!