假设你有一个界面
public interface Change {
void updateUser();
void deleteUser();
void helpUser();
}
Run Code Online (Sandbox Code Playgroud)
我已经读过接口是Java实现多重继承的方式.您实现了一个接口,然后您可以访问其方法.我不明白的是,这些方法在界面中没有任何主体,所以你需要在你的类中给它们一个主体.因此,如果您的接口由多个类实现,则需要在多个类中为该方法提供一个主体.为什么这比在类中使用单独的方法更好,而不是实现接口?
Bri*_*ian 42
我在大学的教授曾经给出了一个很好的轶事来描述多态性和封装.它是这样的.
有谁知道汽水机的工作原理吗?(提示混淆了我们为什么甚至谈论这个问题的一瞥.)不是吗?让我告诉你.
你放弃你的改变,在机器内部是一个小猴子,他会计算你所有的变化,以确保你投入足够的钱.按下苏打水的按钮时,会有一个小灯亮起来告诉猴子你按下了哪个按钮,如果你输入了正确的更换量,他会抓住你的选择并把它扔进小洞里,让你拿着苏打水.
这是封装的概念.我们隐藏了汽水机的实施.除非它有一个那些花哨,清晰的窗户让你看到内部,你真的不知道它是如何工作的.你所知道的就是你投入了一些现金,你按了一个按钮,如果你投入足够的钱,就会得到你的饮料.
除此之外,您还知道如何使用汽水机的界面,因此只要机器的界面遵循通常的汽水机界面,您就可以使用它.这称为接口契约.这台机器可以将来自南极洲的饮料带到传送带上,只要你得到你的饮料,它很冷,你会得到改变.
多态性是这样的想法:当你使用苏打水机界面时,它可能会做不同的事情.这就是封装和多态性密切相关的原因.在多态性中,你所知道的就是你正在使用一个SodaMachine可以改变的实现,因此,可以在幕后完成不同的事情.这导致了多态性的驱动概念,即一个对象SodaMachine实际上充当a MonkeySodaMachine和a ConveyorSodaMachine依赖于实际在接口后面的机器的能力.
可能不是逐字逐句,但足够接近.从本质上讲,它归结为两个概念:多态性和封装.如果您想要澄清,请告诉我.
为什么这比在类中使用单独的方法更好,而不是实现接口?
因为如果一个类C实现一个接口I,可以使用C每当I预期.如果您没有实现该接口,则无法执行此操作(即使您提供了接口要求的所有适当方法):
interface I {
void foo();
}
class C1 implements I {
public void foo() {
System.out.println("C1");
}
}
class C2 { // C2 has a 'foo' method, but does not implement I
public void foo() {
System.out.println("C2");
}
}
...
class Test {
public static void main(String[] args) {
I eye1 = new C1(); // works
I eye2 = new C2(); // error!
}
}
Run Code Online (Sandbox Code Playgroud)
它将调用者期望的内容与实现区分开来.您可以在不了解实现的情况下调用一组纯方法.事实上,像JMS和JDBC这样的库提供了没有任何实现的接口.
这种分离意味着您不需要知道任何实际实现的类.
接口允许您保证某些方法存在并返回所需的类型。当编译器知道这一点时,它可以使用该假设来处理未知类,就好像它们具有某些已知行为一样。例如,可比较的接口保证实现类将能够 compareTo() 一些类似的对象并返回一个 int。
这意味着您可以比较实现此接口的任何内容 - 因此您可以对任何 Comparable 进行排序,而不是编写一种方法对字符串进行排序,另一种方法对整数进行排序,而另一种方法对 LabelledBoxesOfBooks 进行排序
| 归档时间: |
|
| 查看次数: |
39257 次 |
| 最近记录: |