繁体   English   中英

Java中的构造函数

[英]constructors in java

public class A {
public A() {
    System.out.println("a1");
}
public A(int x) {
    System.out.println("a2");

}}

public class B extends A {
public B() {
    super(5);
    System.out.println("b1");
}
public B(int x) {
    this();
    System.out.println("b2");
}
public B(int x, int y) {
    super(x);
    System.out.println("b3");
}}

我不明白为什么当我运行B b= new B();时不应用A的默认结构B b= new B();

B扩展了A,所以我们首先将A的结构打印为“ a1”,然后将A的第二种结构称为“ a1”,而B()打印“ b1”,但是当我运行它时,它只打印“ a2,b1”,因此显然A()开始就不会应用A() -为什么?

当你说B b = new B(); 您正在调用默认的构造函数

public B() {
    super(5);
    System.out.println("b1");
}

由于已经调用了其超级构造函数[ super(5) ],因此编译器将不会插入隐式默认构造函数。 因此,结果。

注意:从您的问题来看,您似乎具有在创建对象时调用所有构造函数的想法。 恐怕这是不正确的。 只有构造函数将被调用,你显式调用创建对象。 如果该构造函数通过this()方法调用其他构造函数,则仅将调用其他构造函数。

这是因为您在B构造函数中调用了super(5),后者调用了第二个A构造函数而不是第一个。

B扩展了A,所以首先我们称A的结构为“ a1”

这句话是不正确的。 在B类中,您的无参数构造函数

public B() {
    super(5);
    System.out.println("b1");
}

调用具有int参数的超类(类A)的构造函数。

public A(int x) {
    System.out.println("a2");
}

您永远不会调用super(),因此当您调用B的任何构造函数时,不会调用显示“ a1”的构造函数

调用超级构造函数必须是构造函数的第一行。 如果要调用超类的无参数构造函数(在本例中为打印“ a1”的构造函数),则应编写...

public B() {
    super();
    System.out.println("b1");
}

如果您未指定调用超级构造函数,那么java会自动调用no参数超级构造函数。

我认为您会误解Java如何处理构造函数。 首先,默认情况下,Java在每个类中调用一个构造函数,除非您明确告知它使用this(...)来调用更多构造函数。 其次,一个被调用的构造是超类的默认构造函数(因此它将调用super() ,而不是this() ); 所以A类实际上看起来像这样:

public class A {
  public A() {
     super(); // implicit call to super(), which is Object()
     System.out.println("a1");
  }
  public A(int x) {
    super(); // implicit call to super(), which is Object()
    System.out.println("a2");
  }
}

因此,调用A()将隐式调用Object() ,但是调用A(int x) 将隐式调用Object() ,而不是-似乎是假设的A()

由于在B中您始终明确指定要调用另一个构造函数,因此编译器将不会添加任何内容。 下面我添加了对super(...)this(...)的调用将发生什么的注释

   public class B extends A {
      public B() {
        super(5); // explicit call to A(5), no implict call to A()
        System.out.println("b1");
      }
      public B(int x) {
        this(); // explicit call to B(), no implicit call to A()
        System.out.println("b2");
      }
      public B(int x, int y) {
        super(x); // explict call to A(x), no implicit call to A()
        System.out.println("b3");
      }
    }

同样,要记住的重要一点是,除非您使用this(...)super(...)显式调用另一个构造函数,否则Java将在任何构造函数的第一行中插入对super()的调用。 永远不会自己插入this()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM