在java中从另一个调用一个构造函数

call one constructor from another in java

本问题已经有最佳答案,请猛点这里访问。

这是采访中问的问题。如果一个类在Java中有多个构造函数,什么时候调用另一个构造函数,那么我们可以调用另一个构造函数吗?我怎么称呼我是指语法?


你可以,我知道我的语法是

1
this(< argument list >);

你也可以通过调用超类的构造函数

1
super(< argument list >);

两个这样的调用可以做的只能在构造函数的第一个语句(你只能调用一个构造函数和其他人在做什么,是)。


是的,你可以这么做。

有一个看《ArrayList实现为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public ArrayList(int initialCapacity) {
    super();
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal Capacity:"+
                                           initialCapacity);
    this.elementData = new Object[initialCapacity];
}

/**
 * Constructs an empty list with an initial capacity of ten.
 */

public ArrayList() {
    this(10);
}

第二个构造函数调用的第一个与default capacity十大学院。


答案是不完整的,所以我在这一个填写的空白。

你可以调用另一个构造函数中的一个,从相同的类的超类,或呼叫,具有以下的限制:

  • 它是在第一行的代码在调用构造函数。
  • 不能有任何显式或隐式this参考。你不能通过一内(甚至一个匿名类的任何实例的引用,如果它的方法),或作为一个结果,非静态方法调用的参数。
  • 《语法的人是:(继续)

    1
    2
    3
    4
    5
    6
    7
    8
    MyClass() {
       someInitialization();
    }

    MyClass(String s) {
         this();
         doSomethingWithS(s);
    }

    你瞧,这是一telescoping /构造函数叫做伸缩模式。

    这是一个显式的构造函数中讨论的8.8.7.1 invokations JLS

    • Alternate constructor invocations begin with the keyword this (possibly prefaced with explicit type arguments). They are used to invoke an alternate constructor of the same class.
    • Superclass constructor invocations begin with either the keyword super (possibly prefaced with explicit type arguments) or a Primary expression. They are used to invoke a constructor of the direct superclass.

    1
    this(other, args);


    例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class FileDb {

      /**
       *
       */

      public FileDb() {
        this(null);
      }

      public FileDb(String filename) {
        // ...
      }

    }