大家看看这个程序把!(弄懂接结分)

jsjwql 2003-08-19 08:37:43
class A {
A() {
System.out.println("A.A called");
}
A(int i) {
this();//这里不是调用上面的构造方法吗?是不是要执行上面的代码一次呢?
System.out.println("A.A(int) called");
}
}

class B extends A {
int i = f();
int j;

{
j = 37;
System.out.println("initialization block executed");
}

B() {
this(10);
System.out.println("B.B() called");
}

B(int i) {
super(i);//这应该是调用上面的第二个构造方法,那该方法是不是也要执行一次呢?
System.out.println("B.B(int) called");
}

int f() {
System.out.println("B.f called");
return 47;
}
}

public class CtorDemo3 {
public static void main(String args[]) {
B bobj = new B();//它初使化b的时候要调用父类的构造方法,但父类有两个构造方法,先调用哪个?为什么两个都调,为什么?
}
}

程序的输出是:

A.A called
A.A(int) called
B.f called
initialization block executed
B.B(int) called
B.B() called

...全文
42 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
RichardKong 2003-08-23
  • 打赏
  • 举报
回复
实际方法调用。
ewingchen 2003-08-23
  • 打赏
  • 举报
回复
楼主还要好好学啊
GZ
prokingvov 2003-08-23
  • 打赏
  • 举报
回复
好多人啊 我看我就up 一下算了 hoho~
jsjwql 2003-08-23
  • 打赏
  • 举报
回复
谢谢大家支持,我还是过两天再揭贴吧,一是想再有高手发表点看法.二则就是和我一样为此捆饶的兄弟也可以学习学习.
yrne 2003-08-22
  • 打赏
  • 举报
回复
呵呵,好详细!
fpwang 2003-08-22
  • 打赏
  • 举报
回复
学习
jsjwql 2003-08-22
  • 打赏
  • 举报
回复
谢谢
jsjwql 2003-08-21
  • 打赏
  • 举报
回复
override 是关于什么方面的
你们知道哪里有这方面的资料吗?
cheng715 2003-08-21
  • 打赏
  • 举报
回复
建议楼主去看看:override 就明白其中道理拉!
司码君 2003-08-21
  • 打赏
  • 举报
回复
super的作用在这里可以看作是参数传递给父类的构造函数,但是实际上是执行父类初始化
Jumperr 2003-08-21
  • 打赏
  • 举报
回复
“不过B类中的方法f()将超类A中的方法f()覆盖上,所有在超类A中进行int a=f()时,实际上是调用的B类中的f()//它不属于构造方法也要调用吗?”——这里是为了初始化B中的i

override是覆写,重写超类中的方法,面向对象的基本特征之一
knight0526 2003-08-21
  • 打赏
  • 举报
回复
我看了上面的例子和解释也很迷糊,有人能解释一下在创建一个对象的时候,(初始化变量或块)和(构造函数)的先后顺序吗?看上面的解释好象是先调用构造函数。在执行构造函数的第一条语句前
在执行初始化变量或块。这种解释好象不能让人理解。
jsjwql 2003-08-20
  • 打赏
  • 举报
回复
还有没有人啊??
qiuzhongshu 2003-08-20
  • 打赏
  • 举报
回复
跟考SCJP那些题差不多
jsjwql 2003-08-20
  • 打赏
  • 举报
回复
不过B类中的方法f()将超类A中的方法f()覆盖上,所有在超类A中进行int a=f()时,实际上是调用的B类中的f()//它不属于构造方法也要调用吗?
jsjwql 2003-08-20
  • 打赏
  • 举报
回复
哦,终于明白了!谢谢!
我总结以下看对不对:
对一个子类进行初始话,先调用他的构造法,但调子构造法前还得先掉用父构造法,调完后,回到子类先把自己的变量初始话之后才再调用自己的构造法(自己的构造法非得最后调用吗,如果在它的后面还有需要被初始话的对象呢?),这样才完成对对象的初始话.

由于在里面的构造法不少,我再想问一下:
如果把上面程序中的super(i)去掉,应该也可以吧??他回自己调用父类的构造法吧.
如果把this()去掉呢?


"因此先输出:A.A called //即先执行A()方法
接着执行了A(int i)方法,输出了 A.A(int) called"
这里如果A还有构造法呢,是不是所有的都要执行,如果这样的话,他们的顺序呢?

liujuntao 2003-08-20
  • 打赏
  • 举报
回复
B bobj = new B();//当然先调用B()构造方法,但是他又调用了
B(int i)方法,而且,在此B(int i)方法中,调用了A(int i)方法,在A(int i)方法中调用了
A()方法
因此先输出:A.A called //即先执行A()方法
接着执行了A(int i)方法,输出了 A.A(int) called
在下面的输出,就是自己的类的构造了,需要从B的开始出执行,就是int i = f();
这一步,输出 B.f called
接着往下执行,输出了 initialization block executed
这样,此类的内部变量都生成后,就要返回到
B(int i) {
super(i);
System.out.println("B.B(int) called");//<<<<<<-----这一步了
}
就输出了 B.B(int) called
然后返回到了调用此构造方法的B()了
接着输出的 就是B.B() called 了

jsjwql 2003-08-20
  • 打赏
  • 举报
回复
还有没有人啊??
bafce 2003-08-20
  • 打赏
  • 举报
回复
上面的那个问题是这个样子的,当生成B类的一个对象的时候,如果B类是别的类的子类,那么初始化过程就要转到B类的超类中进行初始化,不过B类中的方法f()将超类A中的方法f()覆盖上,所有在超类A中进行int a=f()时,实际上是调用的B类中的f(),所以最后结果是2
jsjwql 2003-08-20
  • 打赏
  • 举报
回复
上面的我也大概清楚了,请兄弟门帮我看看这:
由于在里面的构造法不少,我再想问一下:
如果把上面程序中的super(i)去掉,应该也可以吧??他回自己调用父类的构造法吧.
如果把this()去掉呢?


"因此先输出:A.A called //即先执行A()方法
接着执行了A(int i)方法,输出了 A.A(int) called"
//这里如果A还有构造法呢,是不是所有的都要执行,如果这样的话,他们的顺序呢?


还有一个程序:
class A {

A(){}

int a = f();

int f() {

return 1;

}

}

class B extends A {

B(){super();}
int b = a;

int f() {

return 2;

}

}

public class CtorDemo1 {

public static void main(String args[]) {

B bobj = new B();

System.out.println(bobj.b);

}

}

由于没有构造法,它编译的时候会自动加的应该如下:
class A {

int a = f();

int f() {

return 1;

}

}

class B extends A {

int b = a;

int f() {

return 2;

}

}

public class CtorDemo1 {

public static void main(String args[]) {

B bobj = new B();

System.out.println(bobj.b);

}

}
由于这两个构造法都没有什么实际语句,然后它是怎么初始化的呢?
答案是:bobj.b 的值是2

它是把A的int a = f();执行了?为什么?

有没有兄弟帮我总结一下初始化程序的原则!





加载更多回复(14)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧