【问题标题】:call one constructor from another in java [duplicate]在java中从另一个调用一个构造函数[重复]
【发布时间】:2011-01-23 08:35:47
【问题描述】:

这是面试时被问到的问题。 如果一个类在 java 中有多个构造函数,我们可以从另一个构造函数调用一个构造函数吗?我怎么称呼我的意思是语法?

【问题讨论】:

  • 你能澄清一下这个问题吗?有多个构造函数以不同的方式创建对象,并且可以从其他类调用。它们就是为此目的而制造的。
  • 他的意思是调用另一个构造函数。
  • 他在问,当一个类有多个构造函数时,是否允许从另一个构造函数调用构造函数

标签: java constructor


【解决方案1】:

可以,我知道的语法是

this(< argument list >);

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

super(< argument list >);

这两种调用都只能作为构造函数中的第一条语句来完成(所以你只能调用另一个构造函数,并且在其他任何事情完成之前)。

【讨论】:

  • 而且你不能做任何需要参考这个的事情。
  • 它也必须在构造函数的第一行
  • 是的,第一行,所以它将是第一个被实施的
【解决方案2】:

是的,你可以这样做。

查看ArrayList 实现示例:

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 为 10。

【讨论】:

    【解决方案3】:

    没有一个答案是完整的,所以我添加这个来填补空白。

    您可以从同一个类中的另一个构造函数调用一个构造函数,或者调用超类,但有以下限制:

    1. 它必须是调用构造函数中的第一行代码。
    2. 它不能有对this 的任何显式或隐式引用。因此,您不能将内部类(即使是匿名的,如果它引用任何实例方法)或非静态方法调用的结果作为参数传递。

    语法(正如其他人提到的)是:

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

    【讨论】:

      【解决方案4】:

      仅供参考,这称为telescoping/telescopic constructor pattern

      JLS 8.8.7.1 Explicit Constructor Invokations讨论过

      • 备用构造函数调用以关键字this 开头(可能以显式类型参数开头)。它们用于调用同一类的备用构造函数。
      • 超类构造函数调用以关键字super(可能以显式类型参数开头)或主表达式开头。它们用于调用直接超类的构造函数。

      【讨论】:

        【解决方案5】:
        this(other, args);
        

        【讨论】:

        • 这要么是误导,要么就是完全错误!什么是其他?您只需使用 this(args-required-by-constructor)super(args-required-by-constructor); 调用另一个构造函数
        【解决方案6】:

        示例:

        public class FileDb {
        
          /**
           * 
           */
          public FileDb() {
            this(null);
          }
        
          public FileDb(String filename) {
            // ...
          }
        
        }
        

        【讨论】:

          猜你喜欢
          • 2016-07-03
          • 2015-07-02
          • 2013-09-26
          • 2010-09-22
          • 1970-01-01
          • 2020-03-14
          相关资源
          最近更新 更多