两个方法是否可以具有相同的名称和相同的参数并返回相同的类型?
例如,我有这两种方法:
class Method
{
public int mm(int a,int b)
{
return a+b;
}
public int mm(int a,int b)
{
return ab;
}
public static void main*String j[])
{
Method m=new Method();
System.out,println(m.add(12,23);
System.out.println(m.add(12.0f,23.0f);
}
}
但是这段代码会产生错误,这意味着返回类型不应该相同
答案 0 :(得分:0)
Overloading
方法必须有以下不同之处:
答案 1 :(得分:0)
我发现您提供的代码段中存在多个语法错误。没关系,我想当你想在问题中提出代码时语法出错了。
来到您的查询:
您发现自己拥有mm
方法的确切方法签名。 mm
方法都采用int a
和int b
以及returns
int
。
因此编译器将不知道调用什么方法,因为这两个方法将在完全相同的条件下调用。换句话说,当没有调用这些方法中的任何一个时,没有简单的场景。
但是,如果更改任一mm
方法的参数,则代码将编译:
public int mm(int a, int b) {
return a + b;
}
public int mm(float a, float b) {
return 1;
}
public static void main(String j[]) {
Method m = new Method();
System.out.println(m.mm(12, 23));
System.out.println(m.mm(12.0f, 23.0f));
}
在上面的例子中,编译器将在第二个调用语句中调用第二个mm
方法,System.out.println(m.mm(12.0f, 23.0f));
因此,您可以看到,您可以使用相同的return
类型。
希望它可以帮到你!
答案 2 :(得分:0)
对于此类问题,您应该始终查阅JLS。所以我们走了:
<强> §8.4.9. Overloading 强>
如果一个类的两个方法(无论是在同一个类中声明,还是由一个类继承,或者一个是声明的,一个是继承的)都具有相同的名称,但签名不是覆盖等价的,那么方法名称是据说超载了。
接口也是如此:
<强> §9.4.2. Overloading 强>
如果接口的两个方法(无论是在同一个接口中声明,还是由接口继承,或者是声明的和继承的)都具有相同的名称,但不同的签名不是覆盖等效的(§8.4.2) ),然后方法名称被称为重载。
这里解释了“覆盖等效”一词:
<强> §8.4.2. Method Signature 强>
如果m1是m2的子签名或m2是m1的子签名,则两个方法签名m1和m2是覆盖等价的。
本段还解释了“签名”和“子签名”这一术语,其中签名更为重要:
两个方法或构造函数M和N具有相同的签名,如果它们具有相同的名称,相同的类型参数(如果有的话)(第8.4.4节),并且在将形式参数类型N调整为M的类型参数,相同的形式参数类型。
总结一下,这意味着 返回类型不是方法签名的一部分 ,这也意味着不同的返回类型不足以使方法不同(关于超载)。
答案 3 :(得分:0)
不是,两种方法都有相同的签名,你可以使程序意识到自己并破坏世界。尝试这样的事情:
public int mm(int a ,int b, int op)
{
int result = 0;
switch (op) {
case 1:
result = a + b;
break;
case 2:
result = a * b;
case 3:
result = a - b;
default:
break;
}
return result;
}
public static void main(String [] args)
{
Method m = new Method();
System.out.println( m.mm(5,5,1));
}