JAVA中两个不同的接口可不可以定义两个同名的方法?

时间:2021-02-27 08:36:01
请看下面的代码:
interface A{
  public double getOne();
  public int getTwo(int a, int b);
}
interface B{
  public void getOne();
  public int getTwo(double a, double b);
}
class AB implements A, B{
  public double getOne(){
    System.out.println("A");
    return 1.0;
  }
  public void getOne(){
    System.out.println("B");
  }
  public int getTwo(int a, int b){
    System.out.println(a+b);
    return 1;
  }
  public int getTwo(double a, double b){
    System.out.println(a+b);
    return 1;
  }
}
public class Testinterface{
  public static void main(String args[]){
    AB ab = new AB();
    ab.getOne();   
    ab.getTwo(1, 2);
    ab.getTwo(1.0, 2.0);
  }
}
编译不能通过,我想getOne()是方法重名导致不能编译通过,而getTwo()是方法重载应该能编译通过。
有这方面经验的请详解(最好把内存分析写出来),谢了!

14 个解决方案

#1


public double getOne()
public void getOne()
这个是不对的,方法重载要求参数不同

#2


两个接口中可以定义签名一致的方法

#3


引用 2 楼 ticmy 的回复:
两个接口中可以定义签名一致的方法

可以的

#4


怎么觉得你是在考验编译器呢

#5


估计实在是吃饱了撑着没事干才会去做这些事情,楼主你自己想想看有必要这么折腾么?

#6


两个接口中使用同一名字相同的方法怎么了?完全可以的啊?但是要是你在一个类中同时实现这2个方法的时候,就要注意了。最好加上接口名,要么两个接口中的同名方法要实现重载……

#7


呵呵最好不要这样

#8


在代码级别上,方法的签名(识别方法的因素)是 方法名参数列表

在类AB中:
public double getOne()

public void getOne()
这个两个方法的方法名(getOne)和参数列表(无参数)都是一样的,编译器认为同一个方法定义了两次,因此报错.


public int getTwo( int a, int b)

public int getTwo( double a, double b)
的方法名是相同的,但参数列表不同,因此是方法的重载,编译能通过的.

#9



public interface InterfaceA {
String test();
}


public interface InterfaceB {
String test();
}


public class TestInterface implements InterfaceA, InterfaceB {
@Override
public String test() {
return "this is a test";
}
public static void main(String[] args) {
TestInterface tif = new TestInterface();
tif.print(tif);
}
public void print(InterfaceA iA) {
System.out.println(iA.test());
}
public void print(InterfaceB iB) {
System.out.println(iB.test());
}
}

这段代码会产生一个编译错误:The method print(InterfaceA) is ambiguous for the type TestInterface

#10


我想请问一下楼主这么做有什么特殊意义吗?虽然学东西要求甚解,但死钻牛角尖也不是什么好事

#11


一楼说得没错


行还是不行都是有原因的,不是由编译器的设计都想当然的规定的。

就象楼主的那两条语句
AB ab = new AB();
ab.getOne();

在这样的语句中,JVM是不可能判断出程序到底应该调用哪个 getOne() 方法的。因此才会出编译错。

#12


当一个程序员最重要的就是头脑要清晰,也只有这样才能让JVM清晰;例如你写的那个例子:\
void getOne()与double getOne(),当你new一个AB类对象调用getOne()时,你是想调用void getOne()还是double getOne() ? 我想每一个读你那段代码的人都不知道你想调用的是哪一个?人都不知道,JVM能知道吗?所以,不要写让JVM糊涂的代码,这样不报错才怪;
本着这样的一个思路还理解方法的overload与override对你应该的帮助,一个原则就是有重载或重写的方法时,你要知道所调用的只有一个方法!!!

#13


现在好多这种重载的问题。。。

#14


class AB implements A, B{ 
  public double getOne(){ 
    System.out.println("A"); 
    return 1.0; 
  } 
  public void getOne(){ 
    System.out.println("B"); 
  } 

不考虑接口,单纯考虑AB这个类,这个地方就不能编译通过,getOne方法被定义了两次

#1


public double getOne()
public void getOne()
这个是不对的,方法重载要求参数不同

#2


两个接口中可以定义签名一致的方法

#3


引用 2 楼 ticmy 的回复:
两个接口中可以定义签名一致的方法

可以的

#4


怎么觉得你是在考验编译器呢

#5


估计实在是吃饱了撑着没事干才会去做这些事情,楼主你自己想想看有必要这么折腾么?

#6


两个接口中使用同一名字相同的方法怎么了?完全可以的啊?但是要是你在一个类中同时实现这2个方法的时候,就要注意了。最好加上接口名,要么两个接口中的同名方法要实现重载……

#7


呵呵最好不要这样

#8


在代码级别上,方法的签名(识别方法的因素)是 方法名参数列表

在类AB中:
public double getOne()

public void getOne()
这个两个方法的方法名(getOne)和参数列表(无参数)都是一样的,编译器认为同一个方法定义了两次,因此报错.


public int getTwo( int a, int b)

public int getTwo( double a, double b)
的方法名是相同的,但参数列表不同,因此是方法的重载,编译能通过的.

#9



public interface InterfaceA {
String test();
}


public interface InterfaceB {
String test();
}


public class TestInterface implements InterfaceA, InterfaceB {
@Override
public String test() {
return "this is a test";
}
public static void main(String[] args) {
TestInterface tif = new TestInterface();
tif.print(tif);
}
public void print(InterfaceA iA) {
System.out.println(iA.test());
}
public void print(InterfaceB iB) {
System.out.println(iB.test());
}
}

这段代码会产生一个编译错误:The method print(InterfaceA) is ambiguous for the type TestInterface

#10


我想请问一下楼主这么做有什么特殊意义吗?虽然学东西要求甚解,但死钻牛角尖也不是什么好事

#11


一楼说得没错


行还是不行都是有原因的,不是由编译器的设计都想当然的规定的。

就象楼主的那两条语句
AB ab = new AB();
ab.getOne();

在这样的语句中,JVM是不可能判断出程序到底应该调用哪个 getOne() 方法的。因此才会出编译错。

#12


当一个程序员最重要的就是头脑要清晰,也只有这样才能让JVM清晰;例如你写的那个例子:\
void getOne()与double getOne(),当你new一个AB类对象调用getOne()时,你是想调用void getOne()还是double getOne() ? 我想每一个读你那段代码的人都不知道你想调用的是哪一个?人都不知道,JVM能知道吗?所以,不要写让JVM糊涂的代码,这样不报错才怪;
本着这样的一个思路还理解方法的overload与override对你应该的帮助,一个原则就是有重载或重写的方法时,你要知道所调用的只有一个方法!!!

#13


现在好多这种重载的问题。。。

#14


class AB implements A, B{ 
  public double getOne(){ 
    System.out.println("A"); 
    return 1.0; 
  } 
  public void getOne(){ 
    System.out.println("B"); 
  } 

不考虑接口,单纯考虑AB这个类,这个地方就不能编译通过,getOne方法被定义了两次