关于构造方法的一点疑惑,为什么父类的构造方法之后还调用了其他的构造方法?

表述不清,直接上代码

class A {
A(){
System.out.println("A()");
}
A(int i){
System.out.println("A(1)");

}

}

class B {
B(){
System.out.println("B()");
}

}
class C extends A{
B b=new B();
C(){
super(5);
System.out.println("C()");
}

}

public class Fifth {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    C c=new C();

}

}
输出是:
A(1)
B()
C()
问题是为什么在A(1)之后才出B(),这样等于c的构造方法被打断了不是麽?新手就执教

3个回答

java中构造一个类的整个过程可以理解为:
1。构造父类 然后构造本类
2。本类成员变量初始化
3。调用本类构造方法

创建c时先调用类A的构造方法。类A有两个构造方法,调用谁?
[code="java"]super(5);
[/code]
这里你已经指定了调用父类含参数的构造方法。
所以输了A(1)

这是第一步。

第二步:实例化自身成员变量
所以就有了B()

第三步:
[code="java"]System.out.println("C()");
[/code]

所以这里你的
[code="java"]super(5);
[/code]
就有点不好理解。这是java语言规范。
看看反编译结果:
[code="java"]
// Decompiled by DJ v2.9.9.60 Copyright 2000 Atanas Neshkov Date: 2012-2-23 18:35:45
// Home Page : http://members.fortunecity.com/neshkov/dj.html - Check often for new version!
// Decompiler options: packimports(3)
// Source File Name: C.java

package constructor;

import java.io.PrintStream;

// Referenced classes of package constructor:
// A, B

public class C extends A
{

C()
{
    super(5);
    b = new B();
    System.out.println("C()");
}

B b;

}
[/code]

这是class文件反编译的结果。
这样就可以验证我的说法了。

[code="java"]super(5);
[/code]
把上面的代码注释掉后,结果:
A()
B()
C()

反编译结果:
[code="java"]A()
B()
C()[/code]

发编译器:DJ Java Decompiler

ls说的非常详细

建议LZ多看看书,JAVA的构造方法是先构造父类的,然后是自己本身的;
成员变量也是类似;

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐