为什么允许从一个构造函数调用另一个构造函数?

2022-09-03 12:31:28

我正在研究有关SO的其他问题,但我没有真正看到对我的问题的解释。我读到从另一个构造函数调用构造函数(使用this关键字)是有效的,但我不明白为什么它是有效的。

以前,我认为每个对象只有一个构造函数可以执行操作。构造函数链接似乎打破了这种逻辑,因为在调用一个构造函数时,它与原始的目标构造函数一起运行另一个构造函数。为什么构造函数链接有效?


答案 1

我们在同一类中将一个构造函数与另一个构造函数链接(调用),以便我们可以避免代码重复。如果不链接每个构造函数,我们最终会重复业务细节,从而导致代码重复,并且难以维护代码。

想象一下,您正在创建一个总线。

public class Bus {  
      int noOfSeats;  
      String busColor;  

      public Bus() {  
           this(40); //// Using another constructor and proceeding with default values..   
      }  
      public Bus(int seats) {   
           this(seats,"red"); // Using another constructor and proceeding..   
      }  
      public Bus(int seats, String color) {  
           this.noOfSeats = seats; 
           this.busColor = color;  
      }  
 } 

使用此类的人一次只能使用构造函数,而您在内部使用链接。想象一下,你有一个方法,它用默认值初始化事物,并在构造函数中调用它。这没什么错,对吧?

只是为了澄清,创建对象的人只调用一个构造函数。被调用的构造函数调用该类内部的其他构造函数。


答案 2

委托构造函数减少了重复代码的数量,因为您可以通过从一个构造函数调用它来利用在一个构造函数中设置的功能。

在将此功能设计为语言之前,我们必须依赖从构造函数调用的“初始化”类型函数。这是一个痛苦,原因有两个:(i)你永远无法保证函数只是从构造函数调用的,以及(ii)从构造函数调用类方法总是一种设计“气味”。