开始使用Java接口
java中的接口允许开发者构建可重用、可测试、可扩展和可耦合的组件。接口在类中使用时发挥着重要作用,例如,那些相互依赖的类。
让我们假设我们有两个类,X和Z,其中X类依赖于Z类,如果我们改变Z类,X将受到影响。为了减少这种影响,我们在类之间设置接口,这样当我们改变Z类的代码时,就不会影响X类的代码。
在一个有很多类相互依赖的大型复杂应用中,我们可以使用接口来解耦这些类,这样当我们改变一个类中的一行代码时,就会减少对其他类的影响。
前提条件
学习这篇文章,最好具备以下条件。
- 对Java编程语言的基本知识和理解。
- 对Java类和继承的基本了解。
- 安装有IntelliJIDEA。
1.什么是java中的接口?
一个接口是多个类可以继承的方法的集合。
要创建一个接口,你需要使用关键字interface ,如下图所示。
public interface MyInterface {
void method1();
void method2();
void method3();
}
在上面的例子中,我们有一个名为MyInterface 的接口,有三个定义的方法。
接口和类
一个接口说明了实现它的类要做什么,而一个类则解释了应该如何实现它。
为了理解这一点,让我们看一下下面的代码片段。
public interface bird {
void sound();
}
在上面的代码片断中,我们有一个名为bird 的接口。这个接口有一个名为sound 的方法。
我们有不同类型的鸟,它们发出不同的声音。例如,乌鸦发出的声音是 "Caw Caw"。
public class Crow implements bird {
@Override # override keyword instructs the compiler that the method sound is implementing an interface method
public void sound() {
System. out.println("Caw Caw");
}
}
另一种鸟鹦鹉发出的声音是 "Kwi Kwi Kwi"。
public class parrot implements bird {
@Override
public void sound() {
System.out.println("Kwi Kwi Kwi");
}
}
在上面的片段中,Crow 和parrot 都实现了接口bird 。然而,这两只鸟的声音是不同的,也就是说,bird 类独立地使用了接口方法。
接口负责产生鸟的声音,而类则显示声音的产生("Caw Caw "和 "Kwi Kwi Kwi")。
注意:当一个类的声音实现了一个鸟的接口时,它有义务包括接口中的所有方法,也就是说,当你实现一个接口时,就像在类和接口之间建立了一个 "合同"。你必须包括接口中的所有方法。
声明接口的规则
@Override annotation,应该在接口所实现的所有方法上使用。- 接口被说成是它们和实现它们的类之间的一个联系。每当一个接口被编辑时,实现它的类也应该被编辑。
- 接口可以继承其他多个接口。
- 接口的方法总是公开的。
- 接口不能有构造函数。它们不能创建一个对象。
2.实现接口的好处
接口有几个好处。其中一些是。
- 能够扩展你的应用程序。
- 能够孤立地测试一个类。
- 能够在不同的类中重复使用代码。
- 捕捉代码中的错误。接口可以捕捉你代码中的任何错误。例如,如果你忘记在你的类中包含接口中的任何方法,编译器会让你知道。
在代码中演示接口
要做到这一点,打开你的IntelliJ IDEA并创建一个新的目录interface。在/interface ,创建一个接口文件sound ,并添加下面的片段。
public interface sound {
void noisy();
void soft();
}
在上面的接口片段中,我们有两个方法。noisy,另一个是soft 。
现在,让我们在目录/interface 中创建Cat 和dog 类,分别添加下面的代码段。
public class cat implements sound{
public static void main(String args[]){
cat ex = new cat();
ex.noisy();
ex.soft();
}
@Override // helps java to keep track on what is being implemented in the interface
public void noisy() {
System.out.println("purrs");
}
@Override
public void soft(){
System.out.println("meow");
}
}
public class dog implements sound{
public static void main(String args[]){
dog ex = new dog();
ex.noisy();
ex.soft();
}
@Override
public void noisy() {
System.out.println("Noisy voice: "+" woof");
}
@Override
public void soft() {
System.out.println("soft voice: "+" bark");
}
}
为了执行代码段(e.g., dog. class) ,在IntelliJ IDEA中打开终端,输入以下命令。
$ javac dog.java
$ java dog
输出结果将是。
Noisy voice: growl
soft voice: bark
3.接口隔离原则(ISP)
为了理解这个原则,让我们把它与一个有多个充电端口的移动充电器联系起来--C型端口、USB端口1、USB端口2,以及其他许多端口。所有这些类型的端口都连接到一个移动充电器头。虽然充电器有许多端口,但只需要一个端口就可以为一部手机充电。
Interface segregation principle(ISP) 指出,接口不应该有实现它们的类所不需要的方法。广泛的接口应该被分成较小的接口,每个接口执行不同的任务。
ISP演示
让我们在IntelliJ IDEA中创建一个新的目录hotel 。在/hotel ,创建一个接口/hotel/main.java ,并添加下面的片段。
public interface hotel1 {
void room();
void food();
void drink();
}
在上面的接口片段中,我们有三个方法。room,food, 和drink ,这意味着我们可以在类hotel1 中获得一个房间、食物和饮料。让我们在/hotel1 中创建类Beverages ,并添加下面的代码段。
public class Beverages {
public void drink(hotel1 drinking){
drinking.drink();
System.out.println("Ordering coffee");
}
}
在上面的片段中,类Beverages 是依赖于接口hotel1 。如果我们改变接口hotel1 ,该类就会受到影响。让我们编辑我们的接口,如下图所示。
public interface hotel1 {
void room(int size);
void food();
void drink();
}
改变能力void room() ,将影响到类beverages 和其他与该接口耦合的类。为了避免这种情况,我们使用ISP 原则。让我们把我们的接口划分成更小的接口,每个接口将专注于不同的能力。
public interface Drinking {
void drink();
}
在生成一个新的接口时,我们的旧接口将如下图所示。
public interface hotel1 {
void room(int size);
void food();
}
现在我们已经生成了一个轻量级的接口(Drinking),它将只关注喝酒的能力。
总结
在处理包含多个相互依赖的类的大型应用程序时,使用接口是明智的,因为它们可以帮助你调试代码,使你的代码更易于维护。