在java中从另一个调用一个构造函数[重复]

Posted

技术标签:

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

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

【问题讨论】:

你能澄清一下这个问题吗?有多个构造函数以不同的方式创建对象,并且可以从其他类调用。它们就是为此目的而制造的。 他的意思是调用另一个构造函数。 他在问,当一个类有多个构造函数时,是否允许从另一个构造函数调用构造函数 【参考方案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】:

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

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

    它必须是调用构造函数中的第一行代码。 它不能有对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) 
    // ...
  


【讨论】:

以上是关于在java中从另一个调用一个构造函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中从另一个构造函数调用一个构造函数?

C# - 在一些计算后从另一个构造函数调用构造函数[重复]

如何从另一个构造函数调用 C++ 类构造函数 [重复]

Java在另一个[重复]中调用构造函数

爪哇。隐式超级构造函数 Employee() 未定义。必须显式调用另一个构造函数[重复]

Java学习笔记之十九super在Java继承中的用法小结