黑马程序员技术交流社区
标题:
构造初始化问题?
[打印本页]
作者:
jagon
时间:
2014-3-17 10:34
标题:
构造初始化问题?
本帖最后由 jagon 于 2014-3-17 23:12 编辑
package test1;
abstract class A{
public A(){
this.print();
}
public abstract void print();
}
class B extends A {
private int data=10;
public B(int data) {
this.data=data;
}
public void print(){
System.out.println(data);
}
}
public class demo1{
public static void main(String[] args) {
new B(100);
}
}
为什么输出结果是0,不是应该是100吗?请帮忙解答,谢谢了!
作者:
osully
时间:
2014-3-17 10:58
子类构造函数 第一行 有个默认的super();
父类在初始化的时候没有初始化到data,所以默认初始化是0
你写 new B(100).print(); 就可以看到100了 !!!
作者:
焚雨成灰
时间:
2014-3-17 11:03
执行的顺序是这样的:1.B中的data先初始化为0 2.再执行B的构造方法(注意B的构造方法省略super()),因此打印的是0
具体参考:http://blog.csdn.net/macheng365/article/details/6403050
作者:
daoyua
时间:
2014-3-17 11:26
虽然回答你问题,但是我也学到不少,构造函数有个父类的super()是空参数的,调用的print是父类的,父类的print里面什么都没有,所以打印出0
作者:
1014917278
时间:
2014-3-17 20:23
你的子类里面并没有调用过print()方法,并且子类在初始化时,调用构造函数,默认先加载父类的构造函数。
这样就行了。亲
package test1;
abstract class A{
public A(){
this.print();
}
public abstract void print();
}
class B extends A {
private int data=10;
public B(int data) {
this.data=data;
print();
}
public void print(){
System.out.println(data);
}
}
public class demo1{
public static void main(String[] args) {
new B(100);
}
}
复制代码
作者:
chaos
时间:
2014-3-17 21:52
new B(100) 调用b的构造函数,b的构造函数中有super()调用a的构造函数
过程中虽然传递了100但是没有调用b的print()所以没有输出100
作者:
刘一博
时间:
2014-3-17 22:16
本帖最后由 刘一博 于 2014-3-17 22:25 编辑
main方法中new B(100);
首先调用B的带参构造器
public B(int data) {
super(); //当子类初始化时,默认调用父类无参构造器,代码中可省略,但默认调用这一方法
复制代码
父类无参构造函数中调用了print方法,由于子类重写了该方法,实际调用了子类的print方法,此时需注意类加载的顺序,构造函数在非静态成员变量的前面,则此时data还为0,则打印0
当赋值后再次调用print方法,此时输出100
输出结果为0,100
作者:
zms2100
时间:
2014-3-17 22:40
abstract class A{
public A(){
this.print();
}
public abstract void print();
}
class B extends A {
private int data=10; /*如果改为private static int data=10;可以明显清楚是在执行this.data = data;前执行super();时data值初始化值0,而定义为static随类加载而加载也就初始化值为10;*/
public B(int data) {
//super(); 出现0,因为此处先初始化父类构造函数,执行时下面赋值语句未执行。
this.data=data;
}
public void print(){
System.out.println(data+" hehe");
}
}
public class demo1{
public static void main(String[] args) {
new B(100);
}
}
复制代码
LS们基本都说到点上了,LZ理解后可以自行想合适的方式修改。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2