chenjiananxd
chenjiananxd
2012-02-23 16:27

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

已采纳

表述不清,直接上代码

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条回答

  • iteye_16709 iteye_16709 9年前

    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

    点赞 评论 复制链接分享
  • weixin_42361038 weixin_42361038 9年前

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

    点赞 评论 复制链接分享
  • weixin_42583112 weixin_42583112 9年前

    ls说的非常详细

    点赞 评论 复制链接分享