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,不是说多态父类引用指向子类对象吗?
}
}
问题看上面的注释
------解决方案--------------------个人看法:
"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。