由于返回类型在函数重载中没有任何作用,编译器只检查在调用时使用的那部分代码的唯一存在。
那么为什么这段代码不包含错误
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()的唯一存在。
请详细说明
答案 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,您可以避免这种用法:
请参阅“应用”按钮上方的行