考试一题不太清楚,谁能解答一下谢谢了关于java强制类型转换的

值为bar的第二个FOO是谁的成员变量?当然不是s的成员变量。注意它是被声明为静态的,所以它是属于Sub这个class的变量。你可以把Base和Sub这两个class也看成是两个对象,就和b与s一样。所以现在总共是4个对象。其中Base和Sub这两个对象下面有变量FOO。然后再看最后一行输出语句,((Base) s).FOO的意思是,对于对象s,强制转换为Base类型,取其变量FOO。因此它取的是Base这个类下面的FOO,值是foo。所以选D。
■网友
当父类与子类拥有相同名字的属性(不管是不是静态)时
new一个子类对象,实际上是同时拥有2个属性的。究竟访问的是子类还是父类的,由引用的类型决定(而不是对象的实际类型)

当父类与子类拥有相同名字的方法(即子类override了父类的方法)时
【考试一题不太清楚,谁能解答一下谢谢了关于java强制类型转换的】 情况正好想法,调用父类还是子类的方法由对象的实际类型决定。

■网友
解答此题需要理解下面知识点:
父类引用指向子类对象:所能看到的只是父类那部分属性和方法内存图如下:
考试一题不太清楚,谁能解答一下谢谢了关于java强制类型转换的

部分代码内存图关键代码解析:
System.out.println(Base.Foo);Foo是static的,所以Base.Foo访问的是Base类自己的属性,输出:foo
System.out.println(b.Foo);b是Base对象的引用,访问到的也是它自己的属性,输出:foo
其他两条语句同理。
System.out.println(((Base) s).Foo); 把Sub对象的地址赋给Base类型的变量s,此时变量s所能看得到的只是Base那部分属性和方法。所以输出Base类的属性:foo


    推荐阅读