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

DrP*_*per 15 java constructor

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

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

Sur*_*tta 13

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

想象一下,你正在创建一个总线.

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;  
      }  
 } 
Run Code Online (Sandbox Code Playgroud)

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

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

  • 所以只是为了澄清,程序员使用内部构造函数链接是允许的,但是类的用户只能为每个对象调用一个显式构造函数,对吧? (3认同)
  • 此外,这是一个非常奇怪的例子.你可以坐一辆没有座位但没有颜色的公共汽车吗?通常你会反过来链接它们. (3认同)
  • @KaienYang是的,你的理解是正确的. (2认同)

Bat*_*eba 9

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

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