构造方法只有在对象实例化的时候才被调用所以,调用过程是B()->B(int i)->A(int i)->A(),在A(int i)完了之后,开始初始化B中的field,执行初始化块,最后回到B(int i)->B(),这样,一个B的实例对象生成了。
解决方案 »
- for语句问题
- 怎么让进度栏正确显示
- [急!]如何将字符串转换为只有一个长度的字节
- ConcurrentModificationException问题?
- 比如选择2007/10月,如何计算2007年截止到10月31号的天数
- 求助:jboss下如何件将web、应用、数据库三服务器部署在三电脑上?
- 怎样布局JFrame中各控件的大小?
- 谁解释一下重载equals(),hashcode()的例子
- 这是怎么回事?高手请进!
- TTJComboBox_actionPerformed(ActionEvent e)
- 发送邮件发生错误:java.lang.SecurityException: Access to default session denied
- 要工作了~在北京每月1600~郁闷~
我还不太清楚你的意思
用过程是B()->B(int i)->A(int i)->A(),在A(int i)完了之后,开始初始化B中的field,执行初始化块,最后回到B(int i)->B()有的模糊
请指教!
this(10) -> B.B(int) -> A.A(int)[output line 2]
B.f() [output line 3]
..........
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 了
我总结以下看对不对:
对一个子类进行初始话,先调用他的构造法,但调子构造法前还得先掉用父构造法,调完后,回到子类先把自己的变量初始话之后才再调用自己的构造法(自己的构造法非得最后调用吗,如果在它的后面还有需要被初始话的对象呢?),这样才完成对对象的初始话.由于在里面的构造法不少,我再想问一下:
如果把上面程序中的super(i)去掉,应该也可以吧??他回自己调用父类的构造法吧.
如果把this()去掉呢?
"因此先输出:A.A called //即先执行A()方法
接着执行了A(int i)方法,输出了 A.A(int) called"
这里如果A还有构造法呢,是不是所有的都要执行,如果这样的话,他们的顺序呢?
不过,如果不用super(),会调用父类构造子吗?试一下看看吧
还有,就是先调用子类本身的构造子,是构造子里调用了父类的构造子
找本基础的书看看概念吧
====>B(){this(10)}====>B(i)===>B(i){super(i)}
===>A(int i){this();}===>A(){System.out.println("A.A called");}
===>A(i){System.out.println("A.A(int) called");}
===>int i = f();==>int f(){System.out.println("B.f called");return 47;}
===int j;===>{j=37;System.out.println("initialization block executed");}
===>B(int i){System.out.println("B.B(int) called");}
===>B(){System.out.println("B.B() called");}
看样子我还要加把劲啊!!!!!!!
有道理!?
比我强!~~~
B()->this(10)->B(i)->super(i)->A(i)->this()->A()->f()
由于在里面的构造法不少,我再想问一下:
如果把上面程序中的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();执行了?为什么?有没有兄弟帮我总结一下初始化程序的原则!
你们知道哪里有这方面的资料吗?