我是 Java 和学习界面的新手。除了标准化期望之外,我不了解接口的使用。
如果有任何其他用途,请帮助我理解这一点。
接口有一些很好的用途:
多态性
它们允许您以相同的方式处理几个不同但相似的对象。例如:
public interface Flyer {
public void fly();
}
public class Bird implements Flyer {
@Override
public void fly() {
System.out.println("I'm flying");
}
}
public class Airplane implements Flyer {
@Override
public void fly() {
System.out.println("I'm inanimate and flying");
}
}
// then you can have a method like so:
public void makeFly(Flyer flyer) {
flyer.fly();
}
// or make a list like so:
List<Flyer> fliers = Arrays.asList(new Airplane(), new Bird());
它们还允许对象放入几个不同的盒子中。例如,aBird
不仅会飞,而且是Animal
. 接口允许您将Bird
其视为任一:
public interface Animal {
public void move();
}
public class Bird implements Flyer, Animal {
@Override
public void fly() {
System.out.println("I'm flying");
}
@Override
public void move() {
fly();
}
}
// now I can do:
Bird bird = new Bird();
Flyer flyer = new Bird();
Animal animal = new Bird();
解耦设计
此外,它们使您可以灵活地选择实施。(我不确定您所说的“标准化期望”是什么意思,但这种用法可能与标准化最相关。即它之所以有效,是因为它创建了一个标准。)例如,假设我有一个返回List<Flyer>
. 由于List
是一个接口,我可以选择 use ArrayList
,LinkedList
等作为我的实现:
public List<Flyer> makeFlyerList() {
return new ArrayList<Flyer>(Arrays.asList(new Airplane(), new Bird()));
}
// works just the same
public List<Flyer> makeFlyerList() {
return new LinkedList<Flyer>(Arrays.asList(new Airplane(), new Bird()));
}
接口是一种声明实现类的契约的方法;它是在消费者和生产者之间创建抽象和解耦设计的主要工具。
我想到的另一种情况是标记功能。
java.lang.Cloneable
例如,没有任何方法声明,它仅用于标记实现为可克隆类的类。
从文档中:
一个类实现了 Cloneable 接口,以向 Object.clone() 方法指示该方法可以合法地对该类的实例进行逐个字段的复制。
在Serializable中可以看到另一个相同用途的示例
Java 在继承(即多重继承)中存在设计上的限制。所以你不能扩展一个以上的类,但你可以实现任意数量的接口。
在 java 中使用接口的第二个优势与应用程序的设计和性能有关。对于任何应用程序,它都需要“松散耦合”和“高度一致”。这里接口出现了。接口实现类之间的契约,因此设计变得松散耦合。
希望这会有所帮助。
是的,但我反对“公正”这个词。
请记住,您不仅可以定义抽象方法,还可以定义expectation
.
例如,请注意在Map接口中有Map.Entry内部接口。在这里,我们不仅看到了您对 Map 的期望,而且还详细了解了您对 Map 的一些期望,Map
例如他们的Entries
.
尽管您不会在 java API 中找到很多示例,但在实际编程中的许多情况下,接口类中也会有大量的enum
s 和/或public static final
s。这些用于细化和详细说明您可以和不能对此类对象执行的操作。
总而言之,你是对的......在一定程度上...... aninterface
只是标准化期望,但一些研究会告诉你标准化期望是一个广泛而深入的主题,值得一些非常复杂interface
的 s。