class Parent {
int x = 10;
public Parent() {
add(2);
}
void add(int j) {
this.x += j;
}
}
class Child extends Parent {
int x = 9; void add(int j) {
System.out.println("==+++=="+x);//为什么这里输出的x是0
x += j;
System.out.println("===="+x)
}
public Child(){
super();
System.out.println(">>>>>>"+x);
}
}
public class Test {
public static void main(String args[]) {
Parent p = new Child();
System.out.println(p.x);//为什么结果是10,不是说多态父类引用指向子类对象吗?
}
}
问题看上面的注释java对象多态

解决方案 »

  1.   

    个人看法:
    "System.out.println("==+++=="+x);//为什么这里输出的x是0"
        这是个类初始化的问题,楼主参考一下:
        http://wenwen.soso.com/z/q191435823.htm"System.out.println(p.x);//为什么结果是10,不是说多态父类引用指向子类对象吗?"
        对于多态,记得“刘洪旺”老师有个口诀,是否对楼主有用!
        声明父类,创建子类;
        声明的什么,拥有什么;(属性)
        创建的什么,执行什么;(方法)
        创建的什么,可以墙转为什么。
      

  2.   

    http://blog.csdn.net/fortheother/article/details/8856976
    第二个问题我遇到好多次了。
    对于变量来说,使用引用的类型。
    对于方法来说,使用对象的类型。
    第一个问题。
    可能一个对象在创建的时候,首先会调用的是构造函数。x=9;会在构造函数执行完成之后,才会完成x=9这句代码的执行。
      

  3.   

    System.out.println("==+++=="+x);//为什么这里输出的x是0
    了解了对象实例化过程:先实例化父类,再实例化子类;输出结果就好理解了。
    创建child对象时,先创建parent对象,所以调用父类构造函数的时候,child中的x是默认值0,而不是9。父类实例化完成之后才开始实例化子类,此时child中的x等于9.所以输出为0,因为add方法时在父类实例化过程中调用的,而不是子类中。System.out.println(p.x);//为什么结果是10,不是说多态父类引用指向子类对象吗?
    必须明确一个概念,覆写只能覆写方法(函数),不能覆写属性。所以parent依然指向自己的属性x,x=10。