1.接口
1.1 引入
抽取出一个父类,父类所有方法都无法具体实现,也就是父类变成了全部是抽象方法的抽象类(抽象类是允许带有非抽象方法的),此时这个类直接就是用来制定规则的,
接口存在的两个重要意义
- 规则的定义
- 程序的拓展性
1.2 接口的概述(理解)
- 接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。
- Java中接口存在的两个意义
- 用来定义规范
- 用来做功能的拓展
1.3 接口的特点(记忆)
1、java单继承,不支持多继承 但是java支持多实现,一个类可以同时实现多个接口,重写所有抽象方法后才不用做抽象类) 2、实现类实现接口的方法,也称为重写(和子类继承父类重写非常像),从此处看 其实也就是用接口机制变相实现了c++里的多继承 【继承理解为亲爹,实现接口理解为认干爹 亲爹只有一个 但是干爹随便认】 3、class A implements I1,I2{…} I1和I2接口可以有完全一样的重复抽象方法(很像c里面的方法声明),A里有一份实现即可,没有逻辑冲突语法错误啥的
1.4 接口的成员特点(记忆)
1.4.1 成员变量
? 只能是 公有有静态常量
? 默认修饰符:public static final (可以少写不写 默认都会帮你加上 但是不能错写 比如:private)
public interface Inter {
final static int num=10;
}
小结: 接口内 以下两行代码是等价的
int NUM=10;
public static final int NUM=10;
1.4.2 构造方法
? 没有,因为接口主要是扩展功能的,而没有具体存在
那么实现类的构造方法默认的代码 super()执行的是什么呢? ctrl+鼠标点击 查看一下 Object的构造方法 默认 extend Object 当然是 Object了
1.4.3 成员方法
? 只能是抽象方法 (JDK7及之前版本才成立)
? 默认修饰符:public abstract
? 关于接口中的方法,JDK8和JDK9中有一些新特性 (见下文)
public interface Inter {
void study();
}
小结: 接口内 以下两行代码是等价的
List<T> findAll();
public abstract List<T> findAll();
由于重写方法的访问权限要大于等于(父类或者接口)被重新方法的访问权限,因此所有接口实现类对接口方法的实现(重写),修饰符必须是public
演示代码小结:
public interface Inter {
void study();
int NUM=10;
}
public class InterImpl implements Inter {
@Override
public void study() {
System.out.println("我是实现类方法");
System.out.println(num);
}
InterImpl(){
super();
}
}
public class Test1Interface {
public static void main(String[] args) {
InterImpl inter = new InterImpl();
inter.study();
System.out.println(Inter.num);
}
}
1.5 类和接口的关系(记忆)
注意事项1 :继承的同时+实现 可能的冲突
继承类A与实现接口B 中有相同的带方法体的方法,优先执行类A的方法(亲爹嘛)
public class Fu {
public void show(){
System.out.println("Fu...show");
}
}
public interface Inter {
public default void show(){
System.out.println("Inter...show");
}
}
public class Test {
public static void main(String[] args) {
Zi zi=new Zi();
zi.show();
}
}
class Zi extends Fu implements Inter{
}
注意事项2 :接口A多继承接口B、C时可能的冲突
接口A多继承接口B、C时,若B、C有相同的默认方法(带方法体的方法),则接口必须重写该默认方法。【两个干爹的逻辑冲突了,则谁的逻辑都不要,要自己的】
public interface InterA {
public default void show(){
System.out.println("接口A default show");
}
}
public interface InterB {
public default void show(){
System.out.println("接口B default show");
}
}
注意写法,接口支持多继承
public interface InterC extends InterA,InterB {
@Override
public default void show() {
System.out.println("InterC自己重写的default show");
}
}
public class Test {
public static void main(String[] args) {
InterImpl i=new InterImpl();
i.show();
}
}
class InterImpl implements InterC{
}
2.接口组成更新
JDK8版本后,java只对接口的成员方法进行了改进,也就是说接口的成员变量和构造方法都没变化
2.1接口组成更新概述【理解】
-
常量 public static final -
抽象方法 public abstract -
默认方法(Java 8) -
静态方法(Java 8) -
私有方法(Java 9)
2.2接口中默认方法【应用】 【jdk8新增带方法体的方法】 关键字:default
其实或许每个人都想过,抽象类比接口灵活多了,因为抽象类可以有方法实现,可以有抽象方法,给抽象类加一个方法,给个空方法体,就可以让子类有需要地重写,不重写也不会报错。 . 然后对于接口,一旦修改了,比如加了一个方法定义(抽象方法),那么所有接口的实现类都立刻报错,必须所有接口的实现类都重写了(实现了)接口新增方法后才恢复正常。实在是太暴力了 (适配器模式下也得修改适配器本身) . 但是接口的使用已成规范(主要是多实现强于抽象类的单继承)于是在这种情况下JDK8就改进了接口,允许接口里有方法的实现(带方法体的方法)
1、直接继承接口的默认方法(已经有了实现的方法 )
2、也可以重写接口的default方法 (不能再有default关键字了) 3、有逻辑冲突,必须重写
两个干爹都有default方法,我继承的到底是谁的呢? 冲突了,都不用,强制重写,用自己的
2.3接口中静态方法【应用】【jdk8新增静态方法】 关键字:static
实现类名.静态方法名() 调用不行 × 实现类对象.静态方法名() 调用不行 × 只能 接口名.静态方法名() 调用 √ 因此 : 同时实现的两个接口有相同的静态方法,不会产生冲突,实现类根本“继承”不到任何接口的static方法
测试代码小结:
public interface InterA {
public static void show(){
System.out.println("接口A的静态方法");
}
}
public interface InterB {
public static void show(){
System.out.println("B....静态方法");
}
}
public class TestInterface {
public static void main(String[] args) {
InterA.show();
InterImpl i=new InterImpl();
}
}
class InterImpl implements InterA,InterB{
}
2.4接口中私有方法【应用】【jdk9新增 声明格式和普通完全一样】
注意:jdk9环境下才可以测试
小结:接口的使用思路 ★
小知识
1、java单继承,不支持多继承 但是java支持多实现,一个类可以同时实现多个接口,重写所有抽象方法后才不用做抽象类) 2、实现类实现接口的方法,也称为重写(和子类继承父类重写非常像),从此处看 其实也就是用接口机制变相实现了c++里的多继承 【继承理解为亲爹,实现接口理解为认干爹 亲爹只有一个 但是干爹随便认】 3、class A implements I1,I2{…} I1和I2接口可以有完全一样的重复抽象方法(很像c里面的方法声明),A里有一份实现即可,没有逻辑冲突语法错误啥的
1. 接口成员方法默认都是 public abstract (可少写不写 不可错写)
亲测正确
public interface Inter {
abstract void study();
}
2.同理,接口中变量默认都是public static final (可少写不写 不可错写)
public interface Inter {
final static int num=10;
}
注意事项:
静态成员直接 类名.num;类名.study() 或 接口名.num ; 接口名.study() ; 从来都不需要new关键字
|