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对象多态
解决方案 »
- java语言如何在平面坐标系内随机的生成点
- JMenuBar问题
- Struts :Cannot create iterator for this collection 在线等!急!
- 求一款好的java反编译器,在线等
- 求:用按钮调用两个不同的js脚本
- 怎么样输入字符串啊?
- 求高手点拨Socket通信中的一个“字节流文本传输代码实现效果与预期不符”的问题原因..
- JBuilder的词法分析器与语法分析器都是用JAVA写的吗?有没有这类的开源项目,我可能需要做一个类似的东西?UP有分!
- 关于ORACLE的问题
- 告退,散分。
- new一个类为什么要加上this
- 怎样区分MP3文件中存储的内容?例如,区分歌曲和一般录音。
"System.out.println("==+++=="+x);//为什么这里输出的x是0"
这是个类初始化的问题,楼主参考一下:
http://wenwen.soso.com/z/q191435823.htm"System.out.println(p.x);//为什么结果是10,不是说多态父类引用指向子类对象吗?"
对于多态,记得“刘洪旺”老师有个口诀,是否对楼主有用!
声明父类,创建子类;
声明的什么,拥有什么;(属性)
创建的什么,执行什么;(方法)
创建的什么,可以墙转为什么。
第二个问题我遇到好多次了。
对于变量来说,使用引用的类型。
对于方法来说,使用对象的类型。
第一个问题。
可能一个对象在创建的时候,首先会调用的是构造函数。x=9;会在构造函数执行完成之后,才会完成x=9这句代码的执行。
了解了对象实例化过程:先实例化父类,再实例化子类;输出结果就好理解了。
创建child对象时,先创建parent对象,所以调用父类构造函数的时候,child中的x是默认值0,而不是9。父类实例化完成之后才开始实例化子类,此时child中的x等于9.所以输出为0,因为add方法时在父类实例化过程中调用的,而不是子类中。System.out.println(p.x);//为什么结果是10,不是说多态父类引用指向子类对象吗?
必须明确一个概念,覆写只能覆写方法(函数),不能覆写属性。所以parent依然指向自己的属性x,x=10。