表述不清,直接上代码
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的构造方法被打断了不是麽?新手就执教
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的构造方法是先构造父类的,然后是自己本身的;
成员变量也是类似;