java中函数重载的歧义

时间:2012-10-12 18:35:52

标签: java

由于返回类型在函数重载中没有任何作用,编译器只检查在调用时使用的那部分代码的唯一存在。

那么为什么这段代码不包含错误

class Temp{
  Temp(){
    System.out.println("Default Constructor");
  }
  void Temp(){
    S.o.p("HEll"); 
  }
  public static void main(String a[]){
    new Temp();
  }
}

输出=默认构造函数... // 我很震惊没有COMPILE TIME ERROR因为copiler只检查在调用时使用的那部分代码,意味着编译器只需要检查Temp()的唯一存在,并且没有Temp()的唯一存在。

请详细说明

6 个答案:

答案 0 :(得分:2)

因为void Temp()是一个方法,你应该在实例上调用它。允许使用类的名称声明方法,但调用是不同的。您只能使用new运算符调用构造函数。

您可以在JLS#8.8. Constructor Declarations

中详细了解构造函数
  

构造函数永远不会被方法调用表达式(第15.12节)调用。

这里要注意的主要区别是构造函数没有返回类型,重载的定义包括返回类型。

答案 1 :(得分:1)

Constructors不需要返回类型,void Temp()将被视为方法而不是构造函数。

当你调用void Temp();时,将调用没有参数的构造函数。

答案 2 :(得分:1)

一个是构造函数,另一个不是。

答案 3 :(得分:1)

编译器使用关键字new区分方法和构造函数调用。只有构造函数可以在new关键字后面。

答案 4 :(得分:0)

类,方法和字段驻留在不同的名称空间中。编译器始终可以确定使用的构造,并轻松区分new Temp()(类)与o.Temp()(方法)和o.Temp(字段)。

答案 5 :(得分:0)

使用Eclipse,您可以避免这种用法:

See the line above "Apply" button 请参阅“应用”按钮上方的行