黑马程序员技术交流社区
标题:
不解!
[打印本页]
作者:
郑世光
时间:
2012-11-22 21:33
标题:
不解!
写出程序结果: //不解为什么d.i 的值是5,d不是父类的引用吗?那么d.i 的值应该是父类的i的值: i=0+2=2 。 成员变量无论编译和运行不都是参考左边吗?
class Super
{
int i=0;
public Super(String a)
{
System.out.println("A");
i=1;
}
public Super()
{
System.out.println("B");
i+=2;
}
}
class Demo extends Super
{
public Demo(String a)
{
System.out.println("C");
i=5;
}
public static void main(String[] args)
{
Super d=new Demo("A");
System.out.println(d.i);
}
}
作者:
坚持远方
时间:
2012-11-22 21:44
你这是向上转型,可是子类已经改变了父类中i的值,所以上转型之后,父类调用的也是改变之后的
作者:
曹艺先-热爱编程
时间:
2012-11-22 21:52
拿父类new 子类对象只能调用父类和子类都有的方法,不能调用子类特有的方法,d.i 其实是调用的子类的构造函数,因为他是new的子类,也就是所谓的 多态
作者:
潘天功
时间:
2012-11-22 21:57
因为子类继承了父类、父类的变量i ,并在构造方法中将其值改成5、所以i 最终的值为5
作者:
filter
时间:
2012-11-22 22:26
public Demo(String a)
{
//supper();
System.out.println("C");
i=5;
}
public static void main(String[] args)
{
Super d=new Demo("A");
System.out.println(d.i);
}
}
代码中隐去了supper();,对象d一被建立,父类引用就指向了子类对象Demo,因为Demo继承了Supper,所以会先执行supper();
继承父类空参数的构造函数public Super()
{
System.out.println("B");
i+=2;
}
,打印B,i=2(i的初值是0),然后子类的构造函数部分执行打印C,然后成员变量i被赋值为5
结构就是B C 5
成员变量无论编译和运行不都是参考左边吗?这句话很好理解,如果子类构造函数没有对i重新赋值,d.i就是父类初始化的值,但是子类构造函数重新赋值了,d.i就变成5了嘛!楼主钻牛角尖了
作者:
刘腾
时间:
2012-11-22 22:27
class Super
{
int i=0;
public Super(String a)
{
System.out.println("A");
i=1;
}
public Super()
{
System.out.println("B");
System.out.println(i);//i=0
i+=2;
System.out.println(i);//i=2
}
}
class Demo extends Super
{
public Demo(String a)
{
System.out.println("C");
i=5;
System.out.println(i);//i=5
}
public static void main(String[] args)
{
Super d=new Demo("A");
System.out.println(d.i);
}
}
复制代码
作者:
王阳
时间:
2012-11-23 20:37
因为你new的是子类的实力对象,所以会调用子类的构造函数,而且子类的构造函数里面改变了i的值,因为子类继承了父类,所以也就继承了父类的i变量,你在子类中修改子类的值,当然会得到i=5如果你把这段代码去掉,就可以看到结果了。i=2;
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2