接口这个东西我也没怎么自己编写过,不过一写有接口的程序,我还是能明显感觉到它的神奇作用的。
接口的定义
接口在面向对象编程中也是一种重要的概念,它定义了一组方法(或称为接口成员),而不提供具体的实现。接口可以被类实现,使得实现类必须提供接口中定义的所有方法的具体实现。
接口的作用
-
定义契约:接口定义了一个类或对象应该具有的方法。相当于它定义了一个合同或契约,约定了类或对象与外部世界的交互方式。通过接口,可以清楚地知道哪些方法必须实现,以及应该如何使用实现类的实例。
-
实现多态:接口允许一个类实现多个接口,从而实现多态性。一个类可以同时具有不同接口的行为特征,这样在不同的上下文中可以使用该类的不同功能。注意:继承也能实现多态性,但在Java中,语法上是不允许进行多继承的,即子类不能同时继承多个父类。所以说接口是多继承的另一种方式。
-
解耦与灵活性:接口将方法的定义与实现解耦,使得实现类可以根据具体需要提供不同的实现逻辑,而不需要改变接口的定义。这提供了更好的灵活性,使得系统可以根据需求随时替换不同的实现类。
这里确实有种不说人话的感觉,什么是解耦?看过百度百科后,对它还是一知半解,
在编程中, 解耦(Decoupling)指的是减少代码之间的依赖性,以降低不同组件、模块或类之间的耦合程度。解耦的目的是使代码更加模块化、可维护和可扩展,以提高代码的灵活性和可重用性。
举一个不太恰当的例子,听说过人彘没?
假如人类是被编程出来的,眼珠,手,脚,耳朵,鼻子,舌头这些都是耦合性稍低的代码 ,也就是说人类失去了这些功能,虽然几乎是废了,但确实是有可能存活的,但假如失去了人的身体,或者说失去了人的大脑这些耦合性较高的代码,那这个人就直接没了。这就是耦合性高低的区别。
那么灵活性又怎么体现呢,这一般得放在科幻的角度去看,眼睛,手,脚这些可以看作是人这个复杂代码的接口,自然中,我们只有用人手,人脚这些唯一的事物去实现这个接口,但在未来,我们很可能为那些残疾人提供机器臂等现代工具,就像超级英雄电影里的一个叫啥来着的,忘了,他就是一个手用的是机器臂,最后好像还没打赢蜘蛛侠。到时候,想要个金色的手臂,还是想要个猛男粉的手臂完全取决于自己的爱好,这就是接口的灵活性。
4. 接口继承:接口与接口之间也可以存在继承关系,一个接口可以继承另一个或多个接口。这种继承关系使得接口的组织更加灵活,可以通过继承关系构建更复杂的接口层次结构。这里前面说到过,接口是多继承的实现方式。
5.规范与约束:接口定义了一组规范和约束,使得不同的实现类能够遵循相同的接口,从而提高代码的可读性和可维护性。接口还可以用作文档工具,提供给开发者使用,并指导实现类的编写。这就是比较高级,企业编程或者大佬使用的接口的概念了,我现在还没接触过。
代码实现
这里使用教程经常用到的动物类:
创建动物接口,
用狗类和猫类去实现接口,重写里面的方法
public interface Animal {
void makeSound();
}
class Cat implements Animal {
public void makeSound() {
System.out.println("Meow");
}
}
class Dog implements Animal {
public void makeSound() {
System.out.println("Woof");
}
}
主方法
public static void main(String[] args) {
Animal cat = new Cat();
Animal dog = new Dog();
cat.makeSound(); // 输出:"Meow"
dog.makeSound(); // 输出:"Woof"
}
解耦与灵活性的代码实现
这里我们以人类问候的方法为例,我觉得本质上与多态的区别不大,就一笔带过,不分开写代码了。
public interface Greeting {
void greet();//提供一个问候的规范方法
}
public class FormalGreeting implements Greeting {
public void greet() {
System.out.println("Good morning!");//这是正式问候
}
}
class CasualGreeting implements Greeting {
public void greet() {
System.out.println("Hey, what's up?");//这是随性问候
}
}
//定义一个人的类
public class Person {
private Greeting greeting;//具有问候方式这一属性(注意这是一个接口)
public Person(Greeting greeting) {//提供含问候方式的构造器
this.greeting = greeting;
}
public void sayHello() {//提供与他人打招呼的方法
// ...
greeting.greet();//会使用接口中的方法
// ...
}
}
public static void main(String[] args){
Greeting formalGreeting = new FormalGreeting();//将正式问候类创建一个对象
Person person1 = new Person(formalGreeting);用这个对象放到构造器里,来创建一个人的对象
person1.sayHello(); // 输出:"Good morning!",因为是用正式问候类的对象去构造的
Greeting casualGreeting = new CasualGreeting();//与上同理
Person person2 = new Person(casualGreeting);
person2.sayHello(); // 输出:"Hey, what's up?"
}