P171 接口概念
**是一种【公共的规范标准】 **
只要符号标准,就可以【大家通用】
==》为我们带来了便利性
P172 接口的定义基本格式
是多个类的公共规范
一种引用数据类型,最重要的内容是:抽象方法
如何定义呢?
public interface 接口名称{
//接口内容
}
ps:class换成interface之后,编译生成的字节码文件仍然是.java—>.class
接口中可以包含什么内容呢?
Java7:
- 常量
- 抽象方法
java8: - 以上
- 默认方法
- 静态方法
java9: - 以上
- 私有方法
P173 接口的抽象方法定义
在任何版本的java中,接口都能定义抽象方法
格式:
public abstract 返回值类型 方法名称(参数列表);
必须是public abstract(不能private等等
可以省略某个修饰词
抽象方法都是分号结束,别写大括号内方法体!
P174 接口使用的步骤
1、接口不能直接使用,必须有一个“实现类”来“实现”该接口
public class 实现类名称 implements 接口名称{
}
2、接口的实现类必须【覆盖重写】(实现)接口中【所有的抽象方法】
how to:
- 去掉abstract,大括号内直接写!
3、创建实现类的对象,进行使用
- demo01包下有:
-
MyInterfaceAbstract接口==》不能直接用接口类new对象
-
MyInterfaceAbstractlmpl接口实现类==》只有它能new对象使用
-
Demo01Interface创建对象实现类
P175 接口的默认方法定义
public default 返回值类型 方法名称(参数列表){ //默认方法一定是public
方法体
}
在接口类中想新添加一个抽象方法,而实现类中不想写实现时:
==》新添加default方法
P176 如何使用默认方法
public default void methodDefault(){//这里public可以省略,default不能
…方法体
}
实现类可以直接调用接口类中的默认方法
也可以覆盖重写接口的默认方法
P177 接口的静态方法定义
是啥?
该方法和对象是谁无关,只与这个类有关==》【属于类,而不是对象即静态】
怎么写?
public static 返回值类型 接口名称{
方法体
}
P178 怎么使用
接口的静态方法犹如类的静态方法
不能用【实现类对象】调用static方法
必须是【接口名称.static方法】
public static void main(String[] args) {
MyInterfaceStaticImpl impl=new MyInterfaceStaticImpl();
//不能通过接口实现类的对象来调用接口当中的静态方法
//impl.staticmethod();//×,不能调用??!!
//通过接口名称直接调用static方法
MyInterfaceStatic.staticmethod();//成功了
}
P179 接口的私有方法定义
什么情况?
- 在接口中想要抽取一个共有方法,用来解决两个默认方法之间重复代码的问题
- 但是又不想让实现类能用这个共有方法
私有private方法:
- 普通私有方法,解决多个默认方法之间重复代码问题
private 返回值类型 方法名称(参数列表){
方法体
}
- 静态私有方法,解决多个静态方法之间重复代码问题
private static 返回值类型 方法名称(参数列表){
方法体
}
P180 接口的私有方法使用
从java9开始的特性
解决多个静态方法之间重复代码问题
说人话就是:不想让实现类使用这个方法,但是接口中其他方法想用到这个方法
P181 接口的常量定义和使用
接口中也可以定义“成员变量”
但是必须用 public static final挂在前面修饰
可以理解为接口的【常量】
public interface MyInterfaceConst {
//这是接口的一个常量,一旦赋值,不可修改
public static final int num=10;//(三个词也可以省略,但最好不要
}
解读一下几个关键字:
- public:都可以用的意思
- static:和对象无关的意思
- final:不可修改的意思~
final一旦写上,不可修改其值
接口中的常量,【必须赋值】!!!不能不赋值
推荐命名:常量全用大写!
public static final int NUM_OF_MY_CLASS=10;//推荐命名方法
P182 接口的内容小结
1、成员变量=常量
- 记得前面三个修饰词:public static final,虽然不写也行
-
ps:必须赋值/不能改变/完全大写/下划线分割
2、抽象方法
- public abstract 返回值类型 名称(参数列表);
-
实现类【必须】覆盖重写接口所有的抽象方法【抽象类除外】
3、java 8开始,接口可以定义【默认方法】了~!
- public default 返回值 方法名称(){【方法体】}
-
默认方法也【可以】被覆盖重写
4、java 8开始,接口可以定义【静态方法】了~!
- public static 返回值 xxx(){【方法体】}
5、java 9开始,接口可以定义【私有方法】~!
- 【普通私有方法】:private 返回值 xxx(){}
- 【静态私有方法】:private static 返回值 xxx(){}
-
==private方法只有【接口自己】才能调用,不能被实现类/别人使用==
接口的使用注意事项
1、不能有静态代码块/构造方法
2、一个类只有一个爸爸,但是可以有多个接口
public class MyInterfaceImpl implements MyInterfaceA,MyInterfaceB{//这是一个实现类
//覆盖重写【所有抽象方法】(两个接口中的都要写)
}
逗号分开就完事了
ps:如果两个接口中有同样的抽象方法(名字各种都一样),只用重写一次
如果两个接口中有同样的默认方法(名字一样),但是方法体不一样(冲突了)实现类要进行覆盖重写
3、爸爸和接口的默认方法冲突?爸爸优先!
public class Zi extends Fu implements MyInterface{//爸爸和接口
}
** 看!!!又继承爸爸又继承接口,这么写!!!不用打逗号嗷!!┗|`O′|┛ ~~**
P184 接口之间的多继承
前情提要:
- 类与类:单继承
- 类与接口:多实现–》一个类可以实现多个接口
- 接口与接口:多继承
public interface MyInterface extends MyInterfaceA,MyInterfaceB{
public abstract void methodB();
}
若:A有2个,B有2个,其中1个是一样的,子接口C有一个==》C一共有4个!
注意事项
多个父接口的抽象方法不存在冲突的问题(∵无方法体
多个父接口的默认方法若冲突==》子接口自己重写呗!(带着default关键字)
注意:子接口重写的时候为什么还要写default?
∵重写了,相当于重新整个默认方法