日期:2014-05-20  浏览次数:20663 次

java 成员变量在方法中的值

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 对象 多态

------解决方案--------------------
个人看法:
"System.out.println("==+++=="+x);//为什么这里输出的x是0"
    这是个类初始化的问题,楼主参考一下:
    http://wenwen.soso.com/z/q191435823.htm

"System.out.println(p.x);//为什么结果是10,不是说多态父类引用指向子类对象吗?"
    对于多态,记得“刘洪旺”老师有个口诀,是否对楼主有用!
    声明父类,创建子类;
    声明的什么,拥有什么;(属性)
    创建的什么,执行什么;(方法)
    创建的什么,可以墙转为什么。
------解决方案--------------------
http://blog.csdn.net/fortheother/article/details/8856976
第二个问题我遇到好多次了。
对于变量来说,使用引用的类型。
对于方法来说,使用对象的类型。


第一个问题。
可能一个对象在创建的时候,首先会调用的是构造函数。x=9;会在构造函数执行完成之后,才会完成x=9这句代码的执行。

------解决方案--------------------
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。