【问题标题】:Constructor calling itself构造函数调用自己
【发布时间】:2012-03-29 03:42:39
【问题描述】:

我最近发现无参构造函数和多参构造函数不能轮流调用。这种限制的根本原因是什么?有人可能会说构造函数是初始化资源的地方。所以它们不能被递归调用。我想知道这是否是唯一的原因。函数/方法/过程可以递归调用。为什么不是构造函数?

【问题讨论】:

  • 调用自己的构造函数实际上是在创建一个没有退出的无限循环。
  • 并非如此。假设您在 catch 子句中添加该递归步骤,则不会导致无限循环。

标签: java asp.net vb.net c#-4.0 c#-3.0


【解决方案1】:

答案在于,对另一个构造函数的调用是任何构造函数的第一行,因此您的 if 条件中断递归将永远不会被执行,因此堆栈溢出。

【讨论】:

    【解决方案2】:

    构造函数的主要目的是初始化特定类中描述的所有全局变量。

    For Example: 
    
    public class Addition(){
    
    int value1;
    int value2;
    
       public Addition(){ // default constructor
           a=10;
           b=10;
       }
    
      public Addition(int a, int b){
          this(); // constructors having parameters , overloaded constructor
          value1=a;
          value2=b;
      }
    }
    
    public class Main(){
      public static void main(){
         Addition addition = new Addition(); //or
         Addition addition = new Addition(15,15);  
      }
    }
    

    在这里,如果你想创建类的实例,你可以通过调用默认构造函数或调用有参数的构造函数来创建实例。所以构造函数被重载而不是被覆盖。如果要调用另一个构造函数,只能将this()super() 放在构造函数的第一行。但这不是可取的。

    【讨论】:

      【解决方案3】:

      构造函数不打算在对象初始化之外显式调用,因为它在大多数(我猜是所有)语言中都受到限制。相反,您可以创建一个额外的protected Init(...) 成员函数并在构造函数中调用它。

      【讨论】:

        【解决方案4】:

        您关于构造函数不能调用其他构造函数的说法并不适用于每种编程语言。至少我知道 Java 可以做到这一点,而 C++ 不能。但是您可以通过编写私有 __init 函数并让所有构造函数调用它来轻松克服此限制。

        【讨论】:

        • 我的意思是递归地轮流调用对方。我认为 Java 会给出这个编译时错误。
        【解决方案5】:

        在您列出的所有语言中,对象都包含有限(通常很短)的属性集。每个属性都可以包含递归结构(即列表),但它仍然由对象中的单个属性表示。

        我认为不需要递归调用构造函数。使用递归来初始化几个众所周知的属性感觉很奇怪。

        正如您所说,您可以以非递归方式调用构造函数来共享您提到的某些语言的代码。

        C#:Using Constructors

        public Employee(int weeklySalary, int numberOfWeeks)
            : this(weeklySalary * numberOfWeeks)
        {
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-09
          • 1970-01-01
          • 2013-01-11
          • 2012-06-11
          • 1970-01-01
          • 2010-09-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多