10

我几乎是java初学者,我来stackoverflow论坛询问一个简单的问题。我已经在这里检查了类似的问题,但是我没有找到想要的答案,链接:实现接口的类和那个接口之间有什么关系吗?

我们知道如果Cat扩展了Animal,这里就有关系。所以猫是动物(但不一定是动物。动物也是狗..)。我们将这种关系称为“is-a”-继承

如果我们还有另外两个类:GirlCandy,并且如果类 Girl 包含 Candy 的实例,那么我们将这种关系命名为“has-a”- composition,因为我们可以说 Girls has-a Candy。

如果我在上面的例子中做错了什么,请纠正我。

无论如何,我的问题是实现相同接口的类对象之间是否存在某种关系?比方说:

public class A implements InterfaceA {}

public class B implements InterfaceA {}

如果存在某种关系,我们如何利用这种关系?提前谢谢你的回答。。

编辑:对于那些认为没有关系的人,我有一本书“java如何编程第九版”,并且有一个UML图显示了在“关系”中实现相同接口的类?

图片:

在此处输入图像描述

4

4 回答 4

6

实现相同接口的对象之间没有关系。两者都是它们自己的独立实现。他们只是遵循接口定义的协议。

如果您尝试从一种对象类型转换为另一种对象类型,您最终会得到ClassCastException.

编辑:

您的 UML 图表明接口和类(IS-A)之间存在关系,但实现相同接口的两个类之间没有关系。类之间没有关系符号线(就像你在类和接口之间看到的那样)

于 2012-11-19T16:28:51.163 回答
3

这意味着您的类具有由接口方法描述的类似行为。

例如,考虑两个类:FishBird。它们都可以实现Moveable如下接口:

inteface Moveable{
    void move(int x, int y, int z);
}

class Fish implements Moveable{
    public void move(int x, int y, int z){
       swim(x, y, z); 
   }
    private void swim(int x, int y, int z){
      //a method describing how the fish swims
    }
}

class Bird implements Moveable{
    public void move(int x, int y, int z){
       fly(x, y, z); 
   }

    private void fly(int x, int y, int z){
      //a method describing how the bird flies
    }
}

您可以调用接口方法指定的行为,例如:

Moveable bird = new Bird();
Moveable fish = new Fish();

bird.move(10,10,10);
fish.move(10,10,-10);

所以它们中的任何一个都可以移动,尽管它们移动的方式有很大的不同。这样,两个类共享共同的行为,尽管您可能不知道它的实现。

于 2012-11-19T16:38:18.060 回答
0

类的实现与接口的关系,接口也是“is-a”的关系,与从类扩展一样。

它很有用(或者至少是它有用的一个原因),因为通过提供接口,您可以对接口进行编码,而不是对接口的实现进行编码,从而可以轻松(如果需要)将您的实现与大惊小怪。

请注意,如果您要“跨越”继承层次结构,那么查看继承相同接口的两个类之间的关系,这里根本没有隐式关系。

于 2012-11-19T16:28:33.027 回答
0

实现相同接口的两个类之间的关系没有正式的名称。

或者,就此而言,它扩展了相同的基类。如果扩展另一个的孩子是它的孩子,那么同一个类的两个孩子是兄弟姐妹,但这不是通常使用的术语。

如果你想把这个拟人化的比喻扩展到接口,你可以调用两个接口相似的实现,也许。

于 2012-11-19T17:35:35.850 回答