日期:2014-05-19  浏览次数:20774 次

继承关系的类转化问题
只简单的帖一点代码了:

Base   b1   =   new   Base();   b1.i   =   10;
Test   t1   =   new   Test();   t1.i   =   20;

int   ii   =   ((Base)(t1)).i;   //   没有输出,但是输出结果为什么是0?
System.out.println( "ii= "   +   ii);   //   out:   ii=0
System.out.println(b1.i);   //   10
System.out.println(t1.i);   //   20

((Base)(t1)).i   =   30;
ii   =   ((Base)(t1)).i;
System.out.println( "ii= "   +   ii);   //   out:   ii=30
System.out.println(b1.i);   //   10
System.out.println(t1.i);   //   20

class   Test   extends   Base
{
public   int   i;
Test()   {   System.out.println( "Test() ");   }
}
class   Base
{
public   int   i;
Base()   {   System.out.println( "Base() ");   }
}

我用C#和java都测试了结果一样,感觉中间那两块的输出很费解。。。
请帮我解释一下,谢谢。
我感觉要不就创建了临时对象,要不就引用原来的对象,但是无论那个方面也不能解释。

------解决方案--------------------
int ii = ((Base)(t1)).i; // 没有输出,但是输出结果为什么是0?


因为Test类的成员i覆盖了基类的成员i
当t1转换成基类时,由于基类的成员没有赋值过,所以为0

class Test extends Base
{
public int i;
Test() { System.out.println( "Test() "); }
}
改为
class Test extends Base
{
Test() { System.out.println( "Test() "); }
}
再看看
------解决方案--------------------
楼上正确
------解决方案--------------------
System.out.println( "ii= " + ii); // out: ii=0
这里只访问了Test 里面的i