用了很多年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);
}
}
今天心血来潮试试,发现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);
}
}
接口的实质是方法的声明,也就是类的方法实现的一组规范罢了,实现接口的多继承对编译器不会造成什么混乱至于你说的判断某个方法属于哪个 接口,这个很简单你声明这个类型是哪个接口的,编译器就自己识别接口声明的方法,比如直接声明为myinter01如果你声明为myinter03 那么说明你已经不关心myinter03 里面方法到底具体是那个父接口了,你关心的是实现了哪个方法,如果你真的关心,那么直接声明为myinter01
public interface myinter03 extends myinter01, myinter02 {
}
我们知道myinter01, myinter02各自有一个int add(int x,int y)方法
那么myinter03使用的是哪个父接口的int add(int x,int y)方法呢?
//继承了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的方法
}
}
那是不是说明这是sun的一个设计失误呢?因为是多态,在JRE中如何选择指定的add()方法将是一个问题?
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多个
}
}