请看下面的代码:
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()是方法重载应该能编译通过。
有这方面经验的请详解(最好把内存分析写出来),谢了!

解决方案 »

  1.   

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

  2.   

    在代码级别上,方法的签名(识别方法的因素)是方法名参数列表在类AB中:
    public double getOne()

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

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

  3.   


    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
      

  4.   

    一楼说得没错
    行还是不行都是有原因的,不是由编译器的设计都想当然的规定的。就象楼主的那两条语句
    AB ab = new AB();
    ab.getOne();在这样的语句中,JVM是不可能判断出程序到底应该调用哪个 getOne() 方法的。因此才会出编译错。
      

  5.   

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

  6.   

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

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