class Parent2 {
int a = 1; public void test01() {
System.out.println(a);
}
}class Sub2 extends Parent2 {
int a = 2;
int b = 4;
public void test01() {
System.out.println(a);
}
}public class Example {
public static void main(String[] args) {
Parent2 sub2 = new Sub2();
Sub2 sub3 = (Sub2) sub2;
System.out.println(sub2.a);
sub2.test01();
System.out.println(sub3.a);
sub3.test01();
}
}
最后结果是
1
2
2
2
Parent2 sub2 = new Sub2();  这不是new 谁,就拥有谁的属性吗?怎么sub2.a是1?而且调用方法,结果又变成了2,?好郁闷
最后两个结果,是因为向下类型转换,这个我还是懂的

解决方案 »

  1.   

    楼主你可以这样理解,向上转型,就相当于在家里面,儿子在家,有人来找他老爸,他冒充他老爸,比如戴个他老爸的帽子就跟那人出去了。在楼主的代码中,Parent2  中的变量a就相当于他老爸的帽子,那么System.out.println(sub2.a);就相当于把帽子拿出来展示给别人看,虽然儿子也有自己的帽子,但他现在很明显他在冒充他老爸,带的是他老爸的帽子,也就是Parent2中的a,值为1.
    sub2.test01();接着调用方法,楼主的程序里面,父类和子类中都有这个方法,也就是说,子类覆盖了中的方法。打个比方,老爸和儿子都是老师,老爸是教数学的,也就是Parent2中的test01()方法调用Parent2中的a,
    而儿子是教计算机的,也就是子类Sub2中的也是test01()方法,但调用的是Sub2中的a,如果子类中不具备这个,才到父类中去找。所以,sub2.test01()的值为Sub2中的a也就是2.
    希望对楼主有用!
      

  2.   

    成员变量是没有多态的。
    Parent2 sub2 = new Sub2();
    Sub2 sub3 = (Sub2) sub2;
    System.out.println(sub2.a);
    sub2变量的类型是Parent2,所以sub2.a是1。
    sub3变量的类型是Sub2,所以sub3.a是2。但是方法是多态的,实际创建的对象类型是Sub2,所以输出都是2。