构造函数名称和类名在Java中是相同的。为什么?

时间:2014-03-25 06:35:17

标签: java

请给我一个合理的答案,用同名命名构造函数。为什么我们不能为构造函数选择除类名之外的其他名称?

class Temp
{
   Temp()
   {

   }
};

3 个答案:

答案 0 :(得分:7)

因为此语法不需要任何新关键字。除此之外,没有充分的理由。

  

为了尽量减少新关键字的数量,我没有使用这样的显式语法:

class X {
    constructor();
    destructor();
}
     

相反,我选择了一个声明语法,它反映了构造函数的 use

class X {
    X();
    ~X();
     

这可能过于聪明了。 [C ++的设计和演变,3.11.2构造函数表示法]

答案 1 :(得分:6)

与类名相同的构造函数名称只是一种约定。也是一个逻辑 - 考虑对象也可以这样构造

Temp t = Temp();

它可能被称为constructor(),但如果您只查看代码段,则不知道它构建的内容是什么?

答案 2 :(得分:2)

根据定义C ++语言的标准,构造函数没有名称,至少不是由声明声明的标识符(声明符 - ID )。它是使用特定语法声明的匿名函数,仅在某些情况下通过更特殊的语法引用。在其他情况下,相同的术语Temp::Temp指的是class Temp本身。

使用命名立即注入类名的成员声明声明构造函数。它可以通过注入类名称或与::标点符号(嵌套名称说明符)一起使用的type::type形式的其他类型名称引用,最后两个:: - 分隔的部分是相同的标记,特别是上下文,例如委托和继承构造函数。

所有这一切的原因是你不能引用一个构造函数,比如获取一个函数指针或者在不创建新对象的情况下调用它。构造函数本质上与对象生命周期联系在一起。

历史上,构造函数是从工厂函数演化而来的,它返回给定类型的初始化对象。这种模式,其中函数名称可能是别名类型和构造函数仅仅是惯例,在某些语言中仍然可以看到。当前语法是从您在JavaScript中看到的内容演变而来的。一些早期的C ++编译器(考虑THINK C,不确定最早的Cfront版本)并没有将构造函数视为成员。