关于Java中接口的查询
假设我有两个接口接口A和接口B:关于Java中接口的查询,java,interface,object-oriented-analysis,overriding,Java,Interface,Object Oriented Analysis,Overriding,假设我有两个接口接口A和接口B: public interface A { public int data(); } public interface B { public char data(); } 接口A有一个方法public int data(),接口B有一个方法public char data() 当我在某个类C中实现接口A和B时,编译器会给我一个错误。这是java中的一个缺陷吗?我认为这是不允许我们扩展多个类的主要原因之一,那么,当这个问题仍然存在时,为什么允许我们实现多
public interface A {
public int data();
}
public interface B {
public char data();
}
接口A有一个方法public int data()
,接口B有一个方法public char data()
当我在某个类C中实现接口A和B时,编译器会给我一个错误。这是java中的一个缺陷吗?我认为这是不允许我们扩展多个类的主要原因之一,那么,当这个问题仍然存在时,为什么允许我们实现多个接口呢
Java编程语言支持重载方法,Java
可以区分具有不同方法签名的方法。这
意味着类中的方法可以具有相同的名称(如果它们具有相同的名称)
不同的参数列表
而且
不能使用相同的名称和名称声明多个方法
参数的数量和类型相同,因为编译器无法判断
把他们分开
编译器在区分时不考虑返回类型 方法,因此不能声明具有相同签名的两个方法 即使他们有不同的返回类型
两个实现的方法共享一个共同的方法签名(即data()
),因此,编译器无法区分这两个方法,并且将使单个方法满足两个接口契约
编辑: 比如说,
public class Foo implements IFoo, IBar{
public static void main(String[] args) {
Foo foo = new Foo();
((IFoo) foo).print();
((IBar) foo).print();
}
@Override
public void print() {
System.out.println("Hello, World!");
}
}
public interface IBar {
void print();
}
public interface IFoo {
void print();
}
它将输出
Hello, World!
Hello, World!
您提出的问题与多重继承无关。也不是实现多个接口的类实现 当您定义一个接口时,您只是说该接口的实现者应该同意一个契约,并实现该接口上定义的所有方法 一个类实现可以毫无问题地实现多个接口,但接口不能冲突。在您的案例中您试图实现声明具有相同签名的方法的两个接口 在java中,方法签名由名称和参数类型组成 定义:方法声明的两个组件组成 方法签名方法的名称和参数类型 为了重载方法,您需要有不同的签名 Java中的多重继承是不允许的,因为存在一些复杂的问题,例如定义当方法由两个或多个超类实现时应该发生的实现。对于这个话题,我建议大家看看
事实上,在某些情况下,接口用于模拟多继承,允许类呈现一组合并的方法。一种解决方案是使用内部类:
如果您真的需要在同一个类中同时使用这两个接口,这可能也会让您大吃一惊:)Java编译器(我也认为是C)不按返回值区分方法。在您的情况下,编译器认为这两种方法是相同的,尽管返回类型不同您能发布错误消息吗?您的意思是Inner类D实现了B吗?那么java如何处理多个接口中具有相同签名和相同返回时间的方法呢ink以便它将成功编译:)如果它是相同的签名、名称和返回类型,则无需执行任何操作,这两个接口在实现上都是满意的。这两个接口都已实现。@Spaeth:是的,但对于上述问题,这意味着他正在尝试多重继承?否,使用两个接口意味着您的类已实现Antion满足了两个契约,它没有继承性…多重继承是指当您扩展了多个类时(但随后您将遇到其他类型的问题,看看我的答案;)