接口
1.定义:
接口主要是用来拓展功能的,比如USB接口用来连接外置设备;
2.接口的定义格式:
interface 接口名{
}
3.接口要注意的事项 :
(1) 接口是一个特殊的类。(编译的时候也会生成 接口名.class文件,是类就可以定义变量和函数)
(2) 接口的成员变量默认的修饰符为: public static final 。那么也就是说接口中的成员变量都是常量。(必须赋值)
(3) 接口中的方法都是抽象的方法,默认的修饰符为: public abstract。(即使没有写abstract,编译器也会为我们加上abstract)
(4) 接口不能创建对象。(不能实例化,因为接口中的方法是抽象的方法。)
(5) 接口是没有构造方法的。
(6) 接口是给类去实现使用的,非抽象类实现一个接口的时候,必须要把接口中所有方法全部实现。(接口中的方法都是抽象的)
4.实现接口的格式:
class 类名 implements 接口名{
}
5.实例一
interface A{
//成员变量
public static final int i = 10;
//成员函数
public void print();
}
class Demo1 implements A{ //Demo1实现了A接口
public static void main(String[] args){
Demo1 d = new Demo1();
d.print();
}
//实现接口中的方法
public void print(){
System.out.println("这个是接口中的print方法……");
}
}
运行结果如下图所示
6.接口的作用:
(1) 程序的解耦。(低耦合)最重要
(2) 定义约束规范。
(3) 拓展功能。(哪个类实现了这个接口,哪个类就具备了这样的功能,从而提高复用性。)
注意:定义约束规范如下
定义约束规范是:比如门户网站的增删改查是每个模块都有的,两个人开发,每个人有自己的风格。两个人都按指定的日期完成各自的功能,这两个人跳槽后又来了个五年工作经验的人对这个项目做后期维护,看完一个模块会默认其他模块都是这样的,当他去改另外模块的时候发现每个模块都有各自的风格,就没有统一的风格,一个添加的方法在每个模块起了不同的名字,各有特色。这样会导致这个网站的维护成本会变得相当的高。因为他们没有统一的风格
代码后期维护很困难。这就需要项目组长定义接口,会写出一些可能会出现相同功能的接口,码农只需要实现这些接口即可,通过接口来定义约束规范。
7.实例一
(1) 需求:普通的铅笔只有写的功能,普通的橡皮也只有涂改的功能,现在要实现带橡皮的铅笔,让铅笔既有写的功能又有涂改的功能。
(2)分析:
(3)实例:
//普通的铅笔类
class Pencil{
String name;
public Pencil(String name){
this.name = name;
}
public void write(){
System.out.println(name+"沙沙地写……");
}
}
//橡皮接口
interface Eraser{
public void remove();
}
//带橡皮的铅笔
class PencilWithEraser extends Pencil implements Eraser{
public PencilWithEraser(String name){
super(name);
}
public void remove(){
System.out.println("涂改中……");
}
}
class Demo1{
public static void main(String[] args){
PencilWithEraser p = new PencilWithEraser("2B铅笔");
p.write();
p.remove();
}
}
(4)运行结果
8.实例二
(1)需求:在现实生活中有部分同学在校期间只会学习,但是有部分学生除了学习外还会赚钱。
(2)分析:
普通的学生类:都会学习;
接口:会挣钱的学生,因为赚钱的功能是部分学生拓展出来的功能,应该定义在接口上;
(3)实例:
//普通的学生类
class Student{
String name;
public Student(String name){
this.name = name;
}
public void study(){
System.out.println(name+"好好学习");
}
}
//挣钱是学生拓展的功能——定义在接口上
interface Money{
public void makeMoney();
}
//会挣钱的学生
class MoneyStudent extends Student implements Money{
public MoneyStudent(String name){
super(name);
}
public void makeMoney(){
System.out.println(name+"好好挣钱交学费");
}
}
class Demo1{
public static void main(String[] args){
Student s = new Student("张三");
s.study();
MoneyStudent m = new MoneyStudent("李四");
m.study();
m.makeMoney();
}
}
(4)运行结果:
9.类与接口之间关系: 实现关系。
10.类与接口要注意的事项:
(1) 非抽象类实现一个接口时,必须要把接口中所有方法全部实现。
(2) 抽象类实现一个接口时,可以实现也可以不实现接口中的 方法。(抽象类中可以有非抽象方法)
(3) 一个类可以实现多个接口 。
11,疑问:Java不支持多继承,但它为什么却支持多实现?
class A{
public void print(){
System.out.println("AAAAAA");
}
}
class B{
public void print(){
System.out.println("BBBBBB");
}
}
class C extends A ,B{
//错误,仅用于示例
}
如上所示,如果Java支持多继承,会把A和B的方法都继承下来,但是这两个类有两个同名的方法,当别人new C().print()的时候,并不知道要调用哪一个类的实现,会产生冲突。而多实现不会产生这样的问题,对于实现类来说,它只需要实现一个就可以,如果调用print方法,它只会调用已经实现的这个方法,这时候不会产生冲突。
(接口与接口之间是可以多继承的,类与接口之间是可以多实现的)
12.接口与接口之间关系: 继承关系。
13.接口与接口之间要注意事项: 一个接口是可以继承多个接口的。
下一篇: IDEA全局查找关键字的方法