像Runnable这样的界面如何唯一?

时间:2019-02-17 06:12:16

标签: java

我对java / android中的接口的理解是,它们用于确保使用成员函数。例如。类似于Runnable,可确保已实现的类在run()中使用Runnable函数。

但是,这些功能有何独特之处?假设还有另一个像Runnable的接口,它只有一个成员函数-我们称之为Passable-它有1个成员函数,称为pass()

这两个接口到底有什么不同(除了具有不同的名称)?

还是名称使它们与众不同?例如。 Android会检测该类是否被称为Runnable,然后执行其他操作。

2 个答案:

答案 0 :(得分:2)

接口不用于定义调用什么方法。

接口的主要功能之一是将API与实现分开。 例如,这意味着可以使用实现Runnable的任何类在并行线程中运行。 另一种是在继承范围之外定义类的类型。

有效Java语录:

  

Java编程语言提供了两种机制来定义   允许多种实现的类型:接口和抽象   类。两种机制之间最明显的区别是   允许抽象类包含实现   接口不支持某些方法。一个更重要的区别是   要实现由抽象类定义的类型,类必须   是抽象类的子类。定义所有   采取必要的方法并遵守总合同   实现一个接口,无论该类位于   类层次结构。由于Java仅允许单一继承,因此   对抽象类的限制严重限制了它们的使用   类型定义

通过实现Runnable接口,您并没有告诉代码应该调用run方法。您在告诉代码您的类是Runnable的类型,或者从字面上讲出来,您的类是可运行的。

如果您要使用抽象类:Plant,可以使用此示例。 现在,您将使用此类来定义植物的某些常用属性(例如它们需要土壤),然后创建其子类PotatoRosemaryDandelion

现在说您想指出这些植物中的哪些是可食用的,您可以创建一个名为EdiblePlant的中间子类,它是Plant的子类和可食用类的超类。 EdiblePlant有一种称为eat()的方法,因此您可以食用所有食用植物。

现在,如果您还想拥有一个类Animal及其子类DogCowPig。 您将再次需要通过新的中间类EdibleAnimal来指示哪个是可食用的,而又可以使用eat()方法。

我想这似乎没有什么工作,但是现在如果您想让Human吃饭,怎么办?

您将必须同时具有Human.eat(EdibleAnimal animal);方法和Human.eat(EdiblePlant plant)方法。既然我们都可以吃了。

相反,我们可以定义具有方法Edible的接口eat()。这种类型表示实际上可以食用实现这种类型的类(植物和动物)。

因为我们现在有了一种普通的食用食物,所以我们可以对人类Human.eat(Edible food)

由于我们现在有一个分离的接口和实现,因此我们不再考虑如何向Human重构/添加新方法,我们只需要适当地实现Edible类型。

我建议您在开始Android开发之前先阅读一下Java的工作原理,如果您不这样做,则可以形成这些糟糕的理论模型,例如interface determines what methods will be called以及它们何时会发生冲突。在Java的实际工作中,您会感到沮丧,并且将不明白为什么您编写的内容无法按预期进行。

答案 1 :(得分:1)

两个接口可以具有相同的“内容”,例如相同数量的方法和匹配的方法签名。

由于名称不同,它们仍然不同。您甚至可能具有名称相同的接口(或类!),仅偏离程序包名称。例如,存在多个名为Pair的不同类。

但是接口不能确定调用哪些方法。您编写的代码选择了一个方法并调用了该方法,并且某个类实现了特定接口的事实只是告诉您:“好吧,它是一个Runnable,因此我可以并且很可能想调用其run方法”。

您会看到,Java是一种静态编译语言。这意味着您使用类型来传达意图。您是否有一些代码应该在统一的(也许是多线程的)上下文中被其他代码单独调用?然后,您考虑将代码放入Runnable。这就是全部。