Java 构造函数调用自身

Java 构造函数调用自身,java,asp.net,vb.net,c#-4.0,c#-3.0,Java,Asp.net,Vb.net,C# 4.0,C# 3.0,我最近发现无参数构造函数和多参数构造函数不能轮流调用。这种限制的根本原因是什么?有些人可能会说构造函数是初始化资源的地方。因此,不能递归调用它们。我想知道这是否是唯一的原因。函数/方法/过程可以递归调用。为什么不是构造函数 答案在于,对另一个构造函数的调用是任何构造函数的第一行,因此中断递归的if条件将永远不会执行,从而导致堆栈溢出。构造函数不打算在对象初始化之外显式调用,因为它在大多数(我猜全部)中受到限制语言。相反,您可以创建一个附加的受保护的Init(…)成员函数,并在构造函数内部调用它。

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

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

构造函数不打算在对象初始化之外显式调用,因为它在大多数(我猜全部)中受到限制语言。相反,您可以创建一个附加的
受保护的Init(…)
成员函数,并在构造函数内部调用它。

对于每种编程语言,构造函数不能调用其他构造函数的语句都不是真的。至少我知道java可以做到这一点,C++却不行。但是您可以通过编写一个private u init函数并让所有构造函数调用它来轻松克服这个限制。

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

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

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

C#:


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

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()
放在构造函数的第一行。但这是不可预处理的。

拥有构造函数调用本身实际上是在创建一个没有出口的无限循环。不是真的。假设您在catch子句中添加了递归步骤,这不会导致无限循环。我的意思是轮流递归调用对方。我认为Java会给出这个编译时错误。
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);  
  }
}