我对java / android中的接口的理解是,它们用于确保使用成员函数。例如。类似于Runnable,可确保已实现的类在run()
中使用Runnable
函数。
但是,这些功能有何独特之处?假设还有另一个像Runnable
的接口,它只有一个成员函数-我们称之为Passable
-它有1个成员函数,称为pass()
。
这两个接口到底有什么不同(除了具有不同的名称)?
还是名称使它们与众不同?例如。 Android会检测该类是否被称为Runnable
,然后执行其他操作。
答案 0 :(得分:2)
接口不用于定义调用什么方法。
接口的主要功能之一是将API与实现分开。 例如,这意味着可以使用实现Runnable的任何类在并行线程中运行。 另一种是在继承范围之外定义类的类型。
有效Java语录:
Java编程语言提供了两种机制来定义 允许多种实现的类型:接口和抽象 类。两种机制之间最明显的区别是 允许抽象类包含实现 接口不支持某些方法。一个更重要的区别是 要实现由抽象类定义的类型,类必须 是抽象类的子类。定义所有 采取必要的方法并遵守总合同 实现一个接口,无论该类位于 类层次结构。由于Java仅允许单一继承,因此 对抽象类的限制严重限制了它们的使用 类型定义
通过实现Runnable接口,您并没有告诉代码应该调用run方法。您在告诉代码您的类是Runnable的类型,或者从字面上讲出来,您的类是可运行的。
如果您要使用抽象类:Plant
,可以使用此示例。
现在,您将使用此类来定义植物的某些常用属性(例如它们需要土壤),然后创建其子类Potato
,Rosemary
,Dandelion
现在说您想指出这些植物中的哪些是可食用的,您可以创建一个名为EdiblePlant
的中间子类,它是Plant的子类和可食用类的超类。 EdiblePlant
有一种称为eat()
的方法,因此您可以食用所有食用植物。
现在,如果您还想拥有一个类Animal
及其子类Dog
,Cow
,Pig
。
您将再次需要通过新的中间类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。这就是全部。