接口的组成概述
从Java8开始,Java中引入了很多新内容,这些新内容大部分都是依赖接口实现的
接口的组成更新,可以理解为在不同的版本中,接口的组成有哪些变化
接口的组成如下 1、常量:public static final 2、抽象方法:public abstract 3、默认方法(Java8之后才有):default 4、静态方法(Java8之后才有):static 5、私有方法(Java9之后才有):private
接口中的默认方法
需求: 1、定义一个接口MyInterface,里面有两个抽象方法:void show1()和void show2() 2、定义接口的两个实现类:MyInterfaceImplOne、MyInterfaceImplTwo 3、定义测试类,在测试类的main方法中,按照多态的方式创建对象并使用
接口中默认方法的定义格式
public default 返回值类型 方法名(参数列表){}
接口中的默认方法的优点:当我们需要在接口中新增方法时,它不会破坏现有的代码
接口中的默认方法的注意事项: 1、默认方法并不是抽象方法,所以不强制该接口的抽象类一定要重写此默认方法。当然也可以被重写,重写的时候去掉default关键字即可 2、接口中的默认方法的public关键字可以省略不写,注意default关键字不能省略
接口默认方法的练习
xxxxxxxxxx
package ch24;
public interface a_2_1MyInterface {
//无参无返回值的抽象方法
void show1();
void show2();
//如果我们需要新增一个方法,比如show3方法,异
//void show3();
//上面那行会造成该接口的两个实现类报错,为什么报错可以去'a_2_4测试'类里面查看原因,那里已经写的很清楚
//解决就是新建一个'a_2_5MyInterfaceSon'子接口,但是这样会让接口之间的关联加大,造成难以维护的代码耦合
//最理想的解决方式是如下
//如何解决这种耦合度高的问题呢,即需要用到我们这节课学到的'接口的默认方法'。下面那行的public变灰,说明public可以省略不写
public default void show3(){//为什么这行的public一直是灰色,原因:告诉我们public是可以省略不写的,即这行只写'default void show3(){'即可
System.out.println("接口默认方法-新增的show3方法");
}
//优点:不需要在该接口的实现类里面重写show3方法,即'a_2_2MyInterfaceImplOne'和'a_2_3MyInterfaceImplTwo'类里面不需要重写show3方法
//直接就可以在'a_2_4测试'类里面使用该接口的show3方法
//虽然上面那种'接口的默认方法'不需要进行重写就可以在'a_2_4测试'类里面来使用。但是,如果我们就是需要重写呢,怎么才能重写show3方法,如下
//在该接口的实现类里面进行重写,该接口有两个实现类,我们只拿'a_2_2MyInterfaceImplOne'举例子,即在那个实现类里面重写show3方法
}
xxxxxxxxxx
package ch24;
//实现接口,就要重写接口里面的所有方法
public class a_2_2MyInterfaceImplOne implements a_2_1MyInterface{
public void show1() {
System.out.println("One实现类-重写show1");
}
public void show2() {
System.out.println("One实现类-重写show2");
System.out.println("-------------------------");
}
//如何重写'接口的默认方法'
public void show3() {//这行不用写上default关键字
System.out.println("One实现类-重写接口的默认方法show3");
}
}
xxxxxxxxxx
package ch24;
//实现接口,就要重写接口里面的所有方法
public class a_2_3MyInterfaceImplTwo implements a_2_1MyInterface{
public void show1() {
System.out.println("Two实现类-重写show1");
}
public void show2() {
System.out.println("Two实现类-重写show2");
System.out.println("-------------------------");
}
}
xxxxxxxxxx
package ch24;
public class a_2_4测试 {
public static void main(String[] args) {
//按照多态的方式创建接口的实现类对象'a_2_2MyInterfaceImplOne'并使用
//注意:这里'a_2_1MyInterface'接口的实现类对象有两个,分别是'a_2_2MyInterfaceImplOne'和'a_2_3MyInterfaceImplTwo'
a_2_1MyInterface my = new a_2_2MyInterfaceImplOne();
my.show1();//调用'a_2_2MyInterfaceImplOne'实现类的方法,即输出'a_2_2MyInterfaceImplOne'实现类方法里面的内容
my.show2();
a_2_1MyInterface my2 = new a_2_3MyInterfaceImplTwo();
my2.show1();//调用'a_2_3MyInterfaceImplTwo'实现类的方法,即输出'a_2_3MyInterfaceImplTwo'实现类方法里面的内容
my2.show2();
//------------------------------------------------------------------------------------------------------
//当'a_2_1MyInterface'接口里面的方法需要再增加时,即不止有show1和show2方法。比如在'a_2_1MyInterface'接口里面新增一个show3方法
//则'a_2_1MyInterface'接口的两个实现类会报错,即'a_2_2MyInterfaceImplOne'类和'a_2_3MyInterfaceImplTwo'类会报错
//报错原因:实现类要重写接口里面的所有方法,当接口里面的方法增加了,实现类由于没有重写到增加的那几个方法,就会报错
//解决:把'a_2_1MyInterface'接口里面的新增加的show3方法,先注释掉。去定义一个新的接口,如'a_2_5MyInterfaceSon',且
//让'a_2_5MyInterfaceSon'接口继承'a_2_1MyInterface'接口,在'a_2_5MyInterfaceSon'接口里面写我们需要新增的show3方法
//缺点是:当我们那两个实现类需要重写show3方法时,需要来实现'a_2_5MyInterfaceSon'接口,太麻烦了
//简单理解就是,接口之间的关联度混乱,耦合性高,不利于以后的代码维护
//解决:在Java8之后,提出了'接口中的默认方法'即可解决此问题。也就是本节课我们要学习的内容,是不是很期待
//解决:在'a_2_1MyInterface'接口里面,写public default void show3(){}。然后就可以直接在测试类用show3方法,即下面直接用show3方法
my.show3();
//原理:Java中不允许多继承,但是允许多实现
//如果在'a_2_2MyInterfaceImplOne'类里面重写了show3方法,则上面的my.show3(),会优先调用重写过的show3方法
}
}
xxxxxxxxxx
package ch24;
public interface a_2_5MyInterfaceSon extends a_2_1MyInterface{
void show3();
}