一、接口
1、接口是什么?
-
接口也是一种规范:约束别人必须这样设计。
-
规范一定是公开的:比如学校规定每天早上8点上课,是不是要公开出去?
-
所以接口里面设计的常量和抽象方法必须都是公开化的,如果你不用public修饰,它也会默认为public,写不写都是公开的;
-
举个例子:
- 比如生活中的插座,规定是两孔就是两孔,你拿个三孔来插入两孔的,是不是就插不进?
- 比如生活中的插座,规定是两孔就是两孔,你拿个三孔来插入两孔的,是不是就插不进?
2、接口的定义与特点
-
语法格式:
- 接口用
interface
关键字来定义 - 注意:由于接口体现规范思想,规范默认都是公开的,所以接口中代码层面沉淀的修饰符都可以省略不写
public interface 接口名{ // 常量 // 抽象方法 }
package com.app.d9_interface; /** 声明了一个接口:体现一种规范,规范一定是公开的。 目标:理解接口中的成分特点:JDK 8 之前接口中只能有抽象方法和常量 */ public interface InterfaceDemo { // 注意:由于接口体现规范思想,规范默认都是公开的,所以代码层面沉淀的修饰符都可以省略不写 // 1.常量 // public static final String SCHOOL_NAME = "B站大学"; String SCHOOL_NAME = "B站大学"; // 不会报错,默认公开 // public static final String USER_NAME = "admin"; String USER_NAME = "admin"; // 不会报错,默认公开 String PASS_WORD = "123123"; // 不会报错,默认公开 // 2.抽象方法 // public abstract void run(); void run(); // 不会报错,默认公开 // public abstract void eat(); void eat(); // 不会报错,默认公开 void write(); // 不会报错,默认公开 }
- 接口用
二、接口的使用
1、接口的实现
-
接口是用来被类 实现(implements) 的,实现接口的类称为 实现类 ;实现类可以理解成所谓的子类。
修饰符 class 实现类 implements 接口1,接口2,接口3, ...{ }
-
实现关键字:implements;
-
从上面的代码中,接口可以被单类实现,也可以被类多实现。
package com.app.d10_interface_implements; /** 运动员接口:体现运动员的规范 */ public interface SportMan { // 规范一:运动员一定要训练 void run(); // 规范二:运动员一定要参加比赛 void competition(); }
package com.app.d10_interface_implements; /** 法律接口:体现法律的规范 */ public interface Law { // 规范一:必须遵纪守法 void rule(); }
package com.app.d10_interface_implements; /** 乒乓球运动员类——>接口实现类:可以多实现,逗号隔开。 */ public class PingPongMan implements SportMan, Law{ private String name; // 乒乓球运动员姓名 public PingPongMan(String name) { this.name = name; } @Override public void rule() { System.out.println(name + "必须遵纪守法!"); } @Override public void run() { System.out.println(name + "必须每天训练~~"); } @Override public void competition() { System.out.println(name + "要参加比赛,为国争光^_^"); } }
package com.app.d10_interface_implements; /** 测试类: 目标:理解接口的基本使用:被类实现 */ public class InterfaceImplementsTest { public static void main(String[] args) { PingPongMan pingPongMan = new PingPongMan("张继光"); pingPongMan.rule(); pingPongMan.run(); pingPongMan.competition(); } }
张继光必须遵纪守法! 张继光必须每天训练~~ 张继光要参加比赛,为国争光^_^ Process finished with exit code 0
4、接口实现的注意事项
- 一个类实现了接口,必须重写完:全部被实现接口的全部抽象方法,否则这个类需要定义成抽象类。
三、接口与接口的关系
1、基本小结
- 类和类的关系:单继承;
- 类和接口的关系:多实现;
- 接口和接口的关系:多继承,一个接口可以同时继承多个接口。
2、接口多继承的作用
-
规范合并,整合多个接口为同一个接口,便于子类实现。
-
也就是:
- 一个接口继承多个接口,得到多个接口的功能集结于自身,这样接口实现类就只需要实现一个接口,就能得到多个接口的功能。
package com.app.d11_interface_extends; /** 人接口 */ public interface People { /** 规范:人必须吃东西、睡觉 */ void eat(); void sleep(); }
package com.app.d11_interface_extends; /** 法律接口 */ public interface Law { /** 规范:必须守法——>不能杀人、吸毒等等 */ void rule(); }
package com.app.d11_interface_extends; /** 运动员接口 多继承:人接口、法律接口 集结于一身 */ public interface SportMan extends People, Law{ /** 规范:运动员必须运动、比赛 */ void run(); void competition(); }
package com.app.d11_interface_extends; /** 篮球运动员:接口实现类 由于SportMan接口继承了多个接口,所以实现类只需要实现SportMan一个接口 */ public class BasketBallMan implements SportMan{ @Override public void rule() { System.out.println("篮球运动员必须守法"); } @Override public void eat() { System.out.println("篮球运动员必须吃东西"); } @Override public void sleep() { System.out.println("篮球运动员必须睡觉"); } @Override public void run() { System.out.println("篮球运动员必须训练"); } @Override public void competition() { System.out.println("篮球运动员必须参加比赛"); } }
package com.app.d11_interface_extends; /** 测试类 目标:认识接口与接口之间的关系:多继承,并理解其作用 */ public class InterfaceExtendsTest { public static void main(String[] args) { BasketBallMan basketBallMan = new BasketBallMan(); basketBallMan.rule(); basketBallMan.run(); basketBallMan.competition(); basketBallMan.eat(); basketBallMan.sleep(); } }
篮球运动员必须守法 篮球运动员必须训练 篮球运动员必须参加比赛 篮球运动员必须吃东西 篮球运动员必须睡觉 Process finished with exit code 0
四、JDK8开始之后接口新增的方法
1、新增的方法
- 之所以新增的原因呢!也很简单:
- 比如一个程序员,日夜兼程的将一个软件开发出来了,但是呢,后面需要升级这个软件的版本,因此需要去丰富原来的接口,一堆堆的接口一个一个的丰富,丰富完了,还得去接口实现类,实现这些新增的功能,因此开发代码太大了;
- 所以,java想到了一个办法:既能升级技术,又希望实现类的程序代码不用动;
- 这个办法就是:允许接口中直接定义带有方法体的方法。
第一种:默认方法
-
类似之前写的普通实例方法:必须用
defalut
修饰; -
默认会
public
修饰。需要用接口的实现类的对象来调用;defalut void run() { System.out.println("开始跑~~"); }
第二种:静态方法
-
默认会
public
修饰,必须static
修饰; -
注意:接口的静态方法必须要用接口本身的接口名来调用。
static void inAddr() { System.out.println("我们都在bilibili教育中心快乐的学习Java~~"); }
第三种:私有方法
-
就是私有的实例方法,必须使用
private
修饰,从 JDK9才开始有的。 -
只能在本接口中被其他的默认方法或者私有方法访问。
private void go() { System.out.println("准备~~") }
2、IDEA调整编译版本
- 点完ok后,如下代码立马报错!!
- 只需要将jdk版本调整到jdk9之后,就没问题了
3、知识总结
1、JDK8开始新增了那些方法?
- 默认方法:defalut修饰,实现类对象调用;
- 静态方法:static修饰,接口名称调用;
- 私有方法:private修饰,jdk9开始才有的,只能在接口内部其他的默认方法或者私有方法访问。
- 注意:它们都会默认被public修饰的。
提醒:JDK8新增的3种方法我们自己在开发中很少使用的,通常是java源码涉及到。
现阶段需要理解、识别这些语法,明白调用关系即可。
五、接口使用的注意事项
-
1、接口不能创建对象;
- 因为接口是很彻底的抽象,没有构造器,无法创建对象
-
2、一个类实现多个接口,多个接口中有同样的静态方法不冲突;
-
3、一个类继承了父类,同时又实现了接口,父类中和接口中有同名的方法,默认先使用父类的;
-
4、一个类实现了接口,多个接口中存在同名的默认方法,不冲突,这个类重写该方法即可;
-
5、一个接口继承多个接口,是没有问题的,如果多个接口中存在规范冲突则不能多继承。