目录
1.什么是接口?
Java中接口是一种抽象类型,它表示一组方法和常量的集合,但并不提供实现。接口定义了一套规范,通过实现该接口,类可以按照这个规范提供自己的具体实现。接口通常用来描述具有相似行为或功能的类的集合,从而实现代码的复用和扩展性。在Java中,接口通过关键字“interface”来定义,并且只包含方法声明、常量和静态方法,不能包含具体的方法实现。任何实现了接口的类都必须实现接口中的所有方法。接口可以继承其他接口,并且一个类可以实现多个接口。
以上文字太多可能会引起不适,所以我们暂时只要记住以下几点:
a.接口不可以创建对象
b.接口中的方法都是默认抽象的
c.接口的实现类要实现接口中的所有方法
public class TalkPackage implements CallService {
@Override
public void callSer() {
}
}
2.为什么使用接口?
在Java中,使用接口可以实现以下几个目的:
a. 实现多继承:Java不支持多继承,但是一个类可以实现多个接口,从而达到多继承的效果。
public class TalkPackage implements CallService,SuperService {
@Override
public void callSer() {
}
public void superSer(){
}
}
b. 实现代码解耦:接口可以将代码解耦,使得不同的代码模块可以独立开发和测试,最后通过接口实现相互调用。
c. 实现规范和约束:接口可以规范和约束类的行为,使得程序变得更加可靠和可维护。
d. 提高程序的可扩展性:通过接口的使用,可以方便地扩展程序,而不需要修改现有的代码。
3.怎样使用接口?(接口的实例应用)
要求:现在我们拥有一台打印机,在打印机里有彩色的墨水和黑色的墨水,以及A4和B5的纸张,现在要求用接口来实现打印出我们所用的纸张和墨水的类型。
首先第一步我们应该想到要创建接口。可是创建什么为接口呢?打印机?A4B5?好像都行不通,这个时候如果我们花点心思就应该能想到创建一个墨水接口Inbox以及一个纸张接口Paper。
如下图所示:
其次我们就自然而然的想到在Paper接口中写获取纸张的方法,在Inbox接口中写获取墨水颜色的方法,如下所示:
Inbox接口:
public interface Inbox {
public String getColor();
}
Paper接口:
public interface Paper {
public String getSize();
}
既然接口已经创建好了这个时候我们就可以去写他们的实现类了,我们可以很容易的知道Inbox包含彩色和黑色,所以要创建Cai类和Hei类作为Inbox的实现类;同理我们现在应该知道Paper的实现类是什么了吧,没错就是你想的那样,现在我们来创建A4类和B5类。
Cai类:
public class Cai implements Inbox{
@Override
public String getColor() {
return "彩色墨";
}
}
Hei类:
public class Hei implements Inbox{
@Override
public String getColor() {
return "黑色墨";
}
}
A4类:
public class A4 implements Paper{
@Override
public String getSize() {
return "A4纸张。";
}
}
B5类:
public class B5 implements Paper{
@Override
public String getSize() {
return "B5纸张。";
}
}
现在我们可以来写打印机类了,首先想到的是打印机类中需要调用接口类,同时要声明打印机类的构造方法,以及其属性的getter and setter方法,最后要写一个方法输出我们所用的纸张和墨水。如下所示:
Print类:
public class Print {
Inbox inbox;
Paper paper;
public Print() {
}
public Print(Inbox inbox, Paper paper) {
this.inbox = inbox;
this.paper = paper;
}
public Inbox getInbox() {
return inbox;
}
public void setInbox(Inbox inbox) {
this.inbox = inbox;
}
public Paper getPaper() {
return paper;
}
public void setPaper(Paper paper) {
this.paper = paper;
}
@Override
public String toString() {
return "Print{" +
"inbox=" + inbox +
", paper=" + paper +
'}';
}
public void method(){
System.out.println("使用的是"+inbox.getColor()+paper.getSize());
}
}
在测试类中我们所用的调用方式和多态差不多,下面这串代码的意思其实是比较简单的,将彩色墨的方法赋值给inbox,将A4纸的方法赋值给paper,其次再用set方法赋值,如此一来就可以打印出我们所使用的墨水纸张类型了。如下所示:
TestPrint类:
public class TestPrint {
public static void main(String[] args) {
Print print=new Print();
InBox inBox=new Cai();
Paper paper=new A4();
print.setPaper(paper);
print.setInBox(inBox);
print.show();
}
}
以下是输出结果:
4.接口的功能与要求
接口表示的是一种能力:
a.表示它能做什么事情,具体的实现由它的实现类表示,接口中有的都是没有方法体的方法。
b.重点在于实现类有何能力,而不在于实现细节。
c.需要满足has a的关系。
5.抽象类与接口的异同
抽象类和接口都是Java中的面向对象编程概念。
相同点:
a. 都无法被实例化,只能被继承或实现。
b. 都可以包含方法、属性、常量等。
c. 都可以被子类继承或实现。
不同点:
a. 抽象类可以定义构造方法,而接口里不能定义构造方法。由于抽象类可以有构造方法,所以它也可以有实例变量。而接口里的变量都是 public static final 类型的常量,可以没有实例变量。
b. 在Java中,一个类最多只能继承一个抽象类,但一个类可以同时实现多个接口。
c. 抽象类可以包含已经实现的方法,但是接口只能包含声明但未实现的方法,必须由实现接口的类来实现接口中的方法。
d. 接口中的所有方法都是 public 的,而抽象类中的方法可以是 public、private、protected 等权限。
e. 抽象类适用于在具有相似属性和方法的类之间建立一个基类,而接口则适用于定义不同类之间的公共行为。
6.面向对象设计原则
a.单一职责原则(Single Responsibility Principle, SRP):一个类应该只有一个引起它变化的原因,即一个类只负责一项职责。
b.开放封闭原则(Open-Closed Principle, OCP):一个软件实体应该对扩展开放,对修改关闭。当需求变化时,我们应该尽量通过扩展已有代码的方式来满足这些变化,而不是修改已有代码。
c.里氏替换原则(Liskov Substitution Principle, LSP):所有能用基类对象的地方,都应该能够使用其子类对象。
d.依赖倒置原则(Dependency Inversion Principle, DIP):高层模块不应该依赖低层模块,两者应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。也就是说,我们要针对接口编程,而不是针对实现编程。
e.接口隔离原则(Interface Segregation Principle, ISP):客户端不应该依赖它不需要的接口。一个类对另一个类的依赖应该建立在最小的接口上。
f.迪米特法则(Law of Demeter, LoD):一个对象应该对其他对象保持最少的了解,也就是说一个类不应该知道太多关于其他类的信息。尽管这个原则看起来很简单,但是实践中很难实现,因为必须得知道其他类的信息才能完成任务。
g.组合/聚合复用原则(Composite/Aggregate Reuse Principle, CARP):尽量使用组合/聚合,尽量不要使用继承。通过组合或聚合关系设计出的系统具有较好的可重用性、灵活性和扩展性。