标题: 一段小程序的执行结果问题 [打印本页] 作者: 黄小钒 时间: 2012-4-17 22:03 标题: 一段小程序的执行结果问题 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)
{
//super();
System.out.println("C");
i+=5;
}
public static void main(String[] args)
{
int i=4;
Super d=new Demo("A");
System.out.println(d.i);
}
}
liuyang 发表于 2012-4-17 22:28
先执行了下面这个构造函数i从0变到2即i=0+2
public Super()
{
楼主问的不是这个,
而是基类为什么执行的不是这个构造函数
public Super(String a)
{
System.out.println("A");
i=1;
} 作者: 黑马-刘昌文 时间: 2012-4-17 23:00
子类在继承父类时,子类在申明带参数的构造方法时必须显示的调用父类带参数的构造方法,否咋子类会先去调用父类无参的构造方法,再调用自己的构造方法!
刚开始时 i=0,当调用父类不带参数的构造方法时 i+=2; i=2 输出B,再调用自己带参数的构造方法时, i+=5; i=7 输出C, 作者: 李斌 时间: 2012-4-18 13:55
楼主 人品太好了。。{:soso_e163:}作者: 韩新凯 时间: 2012-4-18 14:48
建议:以后尽量不要用关键字命名类。
在 Super d=new Demo("A");System.out.println("i="+d.i);里面的 i 不是你在主方法中定义的int i = 4,
而是继承来自Super类的 i ,通过Super d = new Demo(“A”);首先调用了Super的无参构造函数,运行后 i 的结果变 成了2,后来又调用了Demo的构造函数运行完之后 i 就变成了7.其中d是Super类的引用,d.i调用的依然是Super的 i 。作者: 韩新凯 时间: 2012-4-18 14:49
接下来,祝贺楼主好运。天天拼命挣技术分的孩子上不起啊作者: 马东华 时间: 2012-4-18 15:55
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)
{
//super();
System.out.println("C");
i+=5;
}
public static void main(String[] args)
{
int i=4;
Super d=new Demo("A");-------//虚拟机在加载类的内存是,会调用其相应的构造函数,而如果此类有父类的话,会先加载父类的空参构造函数(结构i=2)当加载本尊的构造
//得出(i+=5;---i=7;)覆盖了原来内存中的i=4;所以打印结果是7。
System.out.println(d.i);
}
}
/* 程序执行结果为:
B
C
i =7 不明白这里 i 为什么等于7?
作者: 黄小钒 时间: 2012-4-18 22:27
马东华 发表于 2012-4-18 15:55
class Super
{
int i=0;
你回答的不对,此处的 int i = 4 是局部变量,而d.i 指的是成员变量,两者没有关系,谈不上覆盖。作者: 黄小钒 时间: 2012-4-18 22:29
liuyang 发表于 2012-4-17 22:28
先执行了下面这个构造函数i从0变到2即i=0+2
public Super()
{