承接上一节,我们讨论了抽象类和抽象方法。
那我们尝试在抽象的道路上走的更远一点,先来总结一下抽象;
抽象类:类中的属性规范了子类必须有什么样的特征,有什么状态。类中的方法规范了子类必须有什么行为,有什么功能。
小总结:抽象类实际上可以看作对子类的一整套的规范要求。
如果我们可以定义一个类,这个类里只有抽象方法,JAVA上称之为接口---interface.
接口的语言规范:
- 接口不能有属性:接口就是一组抽象方法的集合
- 接口的方法必须都是抽象方法,不能有方法体:既然创建一个比抽象类更抽象的一个类,那少了属性,只剩下的就是抽象方法。
- 既然都是抽象方法,那么abstract这个修饰符也可以省略了
- 接口的所有的方法都必须是public:既然你要在另一个类实现它,让抽象方法不可见这不就矛盾了嘛。
当然啊,肯定就会有人提出:那光定义出一个抽象类,里面啥也没有就全写抽象方法,再让子类继承不就行了嘛;别急别急,稍后解答。
接口的创建:
接口的创建格式:
public interface 接口名
{
//抽象方法...
方法返回类型 方法名(参数列表);
方法返回类型 方法名(参数列表);
...//抽象方法只有声明
}
前面说了接口也算是个类,就是里面全是方法——因为没有属性,还全是抽象方法,这点有点特殊,所以就专门写成 interface,不再使用class。我们通常口头上说的类就是只class,接口就是接口。
接口的实现:
抽象类中定义的抽象方法,做到了方法声明和方法实现的分离。抽象类与子类是靠继承,接口的实现也会找一个类实现,大致如此。
接口中定义的抽象方法需要某个类实现这些方法,这时候不再是extends,而是implements(实现);
那么实现接口的这些类就叫做该接口的实现类,并且实现的是接口所有的抽象方法。
总结:类与类之间具有抽象与具体的关系才会用继承,但任何类都可以实现任何接口。
继承里,子类只能单一继承,而接口里,类可以同时实现多个接口。
正如上图,小学生这个类继承了学生类,实现了日常作业DailWork和Recreation娱乐两个接口。
说到这里,我们上面提出的那个问题的答案已经浮出水面:子类要实现某些特殊的行为,但在父类/抽象类里面不能盲目加上,因为其他子类不一定需要这些方法,如果只因满足一个子类而在父类擅自修改,会影响后面无数子类的代码。
所以接口出现了,而且子类只能单一继承,而一个类可以同时实现多种接口。
接口的实现细节:
public interface DailyWork {
void takingClass();
void doHomework();//这是接口的创建,抽象方法的声明
}
public class PrimaryStudent implements DailyWork
{
public void takingClass()
{
System.out.println("日常上课,语数外");
}
public void doHomework()//抽象方法在实现的时候,主动标上public,否则...
{
System.out.println("日常完成作业,语数外");
}
}
抽象方法的介绍在这里:JAVA—抽象—定义抽象类Converter及其子类WeightConverter-CSDN博客
没错,小细节就是在实现接口时,需要主动加上public,和方法声明不同,它不是默认public,前面之所以可以省略public abstract,是因为接口里面全是公开的抽象方法,全都是,所以可以省略。
不加public的话,就是:默认是private
在实现类里面,需要我们亲自标注。
知识了解完了,是骡子是马牵出来溜溜——Java-接口-定义接口Filter及其实现类WordFilter-CSDN博客