用了很多年Java,从来没有用过接口去多继承接口的语法,比如:interface myinter03 extends myinter01, myinter02
今天心血来潮试试,发现java竟然支持extends多个父接口的写法!
这是不是有违Java单继承的设计思想呢?sun为什么要这样设计?
---------------以下使用Eclipse生成的代码,注意class test implements myinter03, myinter01
那么test中继承下来的add()方法是来自于myinter01呢,还是来自于myinter03?---------------------
package com;
public interface myinter01{
public abstract int add(int x,int y);
}
//***********************************
package com;
public interface myinter02 extends myinter01 {
public abstract int subtract(int x,int y);
}
//************************************
package com;
public interface myinter03 extends myinter01, myinter02 {
}
//************************************
package com;
public class test implements myinter03, myinter01 {
@Override
public int add(int x, int y) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int subtract(int x, int y) {
// TODO Auto-generated method stub
return 0;
}
/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
new test().add(3, 4);
}
}

解决方案 »

  1.   


    接口的实质是方法的声明,也就是类的方法实现的一组规范罢了,实现接口的多继承对编译器不会造成什么混乱至于你说的判断某个方法属于哪个 接口,这个很简单你声明这个类型是哪个接口的,编译器就自己识别接口声明的方法,比如直接声明为myinter01如果你声明为myinter03 那么说明你已经不关心myinter03 里面方法到底具体是那个父接口了,你关心的是实现了哪个方法,如果你真的关心,那么直接声明为myinter01
      

  2.   

    从简单点的开始:对于myinter03的定义
    public interface myinter03 extends myinter01, myinter02 {
    }
    我们知道myinter01, myinter02各自有一个int add(int x,int y)方法
    那么myinter03使用的是哪个父接口的int add(int x,int y)方法呢?
      

  3.   

    //public class Test implements Myinter03, Myinter01 {//因为Myinter03
        //继承了Myinter01接口,这里只需要写implements Myinter03即可
        //因为实现了Myinter03接口就一定会实现Myinter01接口
    public class Test implements Myinter03{
        @Override
        public int add(int x, int y) {
    // TODO Auto-generated method stub
            return 0;
        }
        @Override
        public int subtract(int x, int y) {
    // TODO Auto-generated method stub
            return 0;
        }
        /**
         * @param args
         */
        public static void main(String[] args) {
    // TODO Auto-generated method stub
            //如果你需要一个Myinter01的实现,说明你就需要这个接口的实现
            //其他的实现方法你不关心
            Myinter01 inter1=new Test(); //因为Test实现了inter1接口
           inter1.add(3,4);//inter1代码自动提示inter1可以执行的方法
            //说明add方法是inter1声明的
    //        new Test().add(3, 4);        Myinter02 inter2=new Test();
            inter2.subtract(2,3); //inter2自动提示可执行的方法
            //subtract是inter2声明的
            
            Myinter03 inter3=new Test(); //如果你这样声明接口
            //说明你不关心inter3里面哪个方法继承自哪个接口
            //否则,你应该参考上面inter1 inter2的方法
            
        }
    }
      

  4.   

    讲解的很细致!
    那是不是说明这是sun的一个设计失误呢?因为是多态,在JRE中如何选择指定的add()方法将是一个问题?
      

  5.   

    SUN在这里没有什么失误,不知道你说的选择指定的add方法会是什么问题接口的本质是方法实现的声明,一种规范化机制选择add方法没有什么冲突,就像你能走动,既是实现了动物的走动接口,也是实现了人的走动接口,没有什么问题
      

  6.   

    单继承是指不能extends多个对象,而不是接口public class c1{
      public void Sub1(){
    }
    }public class c2{
      public void Sub2(){
    }public class c3 extends c1,c2{ //这个行就不行了!
    }public interface i1{
      void Sub3();
    }public interface i2{
      void Sub4();
    }public class c4 extends c1 impletments i1,i2{//这里只继承了c1一个,实现了i1,i2多个
    }
    }
      

  7.   

    切中了实质,感谢帖主和ioe_gaoyong,俺有点领悟了!