面向接口的编程思想较为普遍:每个人只完成自己的实现编程部分即可。结构实际:为抽象的抽象也是一些约束。
-
普通类:只有具体实现(非抽象方法)
-
抽象类:具体实现和规范(抽象方法)都可以有!
-
接口:只有规范!自己无法写方法~是比抽象类更加抽象的抽象为专业的约束!可以实现约束和实现分类:为面向接口编程~
-
接口就是规范,定义的是一组规则,体现了现实世界中“如果你是...则必须能...”的思想。如果你是天使,则必须能飞。如果你是汽车,则必须能跑。如果你是好人,则必须干掉坏人等等等
-
接口的本质是契约,就像我们人间的法律是一样的。制定好后大家都遵守。
-
OO(面向对象)的精髓,是对对象的抽象,最能体现这一点的就是接口.为什么我们讨论设计模式都只针对具备抽象能力的语言(比如C++,java,c#等),就是因为设计模式所研究的,实际上就是如何合理的去抽象。
声明类的关键字是class,声明接口的关键字是interface
通过interface定义了两个接口TimeService以及UserService以及用class定义了一个UserServiceImpl来实现两个接口中的对应方法。
package com.oop.demo09; public interface TimeService { void timer(); }
首先为TimeService接口
package com.oop.demo09; //最为关键的前提是:锻炼并具备抽象的思维 Java都可以学习掌握 但是成为架构师却很难 //Idea中最左侧目录也会显示图标由C变为I //interface为定义接口的关键字,位置为之前的class位置,每个接口都要有一个实现类 public interface UserService { //接口中定义的属性都是常量(实际上很少在接口中定义常量) public static final int AGE=99;//前方的public static final变灰色便是为默认的不写也可以故而接口中属性均为静态公共常量属性不可以改变 //接口中的所有定义的方法都是抽象的即:public abstract void add(String name);//若最前方写上public abstract变为灰色的表示不写也可以实现本身就是默认的,只写返回值+方法名(参数列表);即可因为abstract没有方法体 //增 void delete(String name);//删 void update(String name);//改 void query(String name);//查 }
此为定义的UserService接口
package com.oop.demo09; //抽象类:通过extends继承 //类可以通过关键字implements实现接口 //通过implements从侧面实现了多继承:即可以通过类实现了多个接口 //多继承:利用接口实现(伪)多继承~ public class UserServiceImpl implements UserService,TimeService {//可以译为定义一个类(接口名后加Impl)实现(implements)相应接口 //开始会报错只有实现(重写)了接口的所有抽象方法才会正常 @Override public void add(String name) { } @Override public void delete(String name) { } @Override public void update(String name) { } @Override public void query(String name) { } @Override public void timer() { } }
此为定义的UserServiceImpl类用来实现对应的两个接口。
首先对于UserService接口:接口的定义是通过Interface关键字来实现的,具体格式与类的定义格式类似为public interface 接口名{//各种方法以及常量}。对于接口中定义的属性都是常量(实际上很少在接口中定义常量),原因为存在默认隐藏修饰符public static final藏在属性定义的最前面就算显式的添加也会变为灰色,由于是常量故而不可改变,定义属性时候格式为:属性类型 属性名;即可。而对于接口中的所有方法实际上都是抽象的,原因为在方法的定义语句的最前面隐藏修饰符public abstract表示为抽象方法,故而没有方法体,例子为:void add(String name);即格式为:返回值 方法名(参数列表);即可完成定义。一般接口中只包含常量与抽象方法。此接口定义了四个抽象方法且返回值均为void类型。为增删改查四个方法。
其次对于TimerService接口只包含了一个抽象方法timer()返回值为void;本身的目的也只是为了证明伪多继承的实现。要明白一个简单概念:一个类本身就可以本多个类继承(如果这个类不是被final修饰)例如object基本上是很多类的父类,而单继承实际上指的是一个类只能继承一个父类,而多继承值:一个类可以继承多个父类。
最后对于UserServiceImpl类是为了实现两个接口而定义的类:对于类名的命名默认为:要实现的接口名末尾加上Impl来命名Impl即为implments(实现)的缩写,对于类的定义上要注意为在类名后加上 implements 接口名1,接口名2,....{}来实现,例如: public class UserServiceImpl implements UserService,TimeService {};对于上节课的抽象类是通过extends来继承父类来实现父类的抽象方法,此时定义的类为:通过implements关键字从侧面实现了多继承:即可以通过类实现了多个接口。仅仅完成类的定义后会报错,因为并没有完成对于要实现的所有接口的所有抽象方法的重写,故而通过Alt+insert关键字来实现对于所有抽象方法的重写即可。完成该类的定义。
接口总结:
接口的一些作用:
1.实际上是一些约束(类似于抽象类)总的约束就为此1-7
2.可以定义一些方法,让不同的人实现(实际上还是单继承)~可以让多个用户实现一个接口的任务(为重写故而实现方式各不相同)
3.方法都默认为public abstract修饰着即默认就是公共的静态方法
3.所有的常(变)量定义中都是为public static final修饰着,默认就是公共的静态常量
5.接口与抽象类一样均不能被直接实例化,但理由不同因为接口中没有构造方法(本身都不是类何来构造方法)
6.implements可以完成多个接口的实现即为(伪)多继承(一个子类继承多个父类(此时为接口))
7.实现是通过:必须要重写对应所有接口中的所有方法来达成的。