一、了解java发展历史
二、Lambda表达式——(最重要)
参见文章:https://blog.youkuaiyun.com/qq_51550750/article/details/125762371
三、接口中新增的方法
1.JDK8中接口的新增
在JDK8中,针对接口有做增强。
在JDK8之前,在接口中:
interface 接口名称{
静态常量;
抽象方法;
}
在JDK8之后,对接口做了一些增加,在接口中还可以有静态方法
和默认方法
。
interface 接口名称{
静态常量;
抽象方法;
默认方法;
静态方法;
}
2.默认方法
2.1为什么要增加默认方法
举例说明:
package com.bones.jdk8Learning_Interface;
/**
* @author : bones
* @version : 1.0
*/
public class Test01 {
public static void main(String[] args) {
A b = new B();
A c = new C();
}
}
interface A{
//在JDK1.8之前接口中只要新增了一个方法,所有实现类都需要重写这个方法,这样子不利于接口的扩展
void test1();
void test2();
}
class B implements A{
@Override
public void test1() {
}
@Override
public void test2() {
}
}
class C implements A{
@Override
public void test1() {
}
@Override
public void test2() {
}
}
再举一个例子:Map类:
有165个实现类:
但是Map中有很多都是抽象方法:
但是有一个方法是默认方法:
那么每一个实现类就没有必要都重写了。
总结一下就是:在JDK8以前端口中只能有抽象方法和静态常量,会存在问题(弱点):
如果接口中新增抽象方法,那么实现类都必须要重写这个抽象方法,非常不利于接口的扩展的。
2.2接口默认方法 的格式
接口中默认方法 的语法格式如下:
interface 接口名称{
修饰符 default 返回类型 方法名{
方法体;
}
}
基本使用:
package com.bones.jdk8Learning_Interface;
/**
* @author : bones
* @version : 1.0
*/
public class Test01 {
public static void main(String[] args) {
A b = new B();
System.out.println(b.test3());
A c = new C();
System.out.println(c.test3());
}
}
interface A{
//在JDK1.8之前接口中只要新增了一个方法,所有实现类都需要重写这个方法,这样子不利于接口的扩展
void test1();
void test2();
//接口中定义的默认方法
public default String test3(){
return "hello ,interface default method exec!";
}
}
class B implements A{
@Override
public void test1() {
}
@Override
public void test2() {
}
//实现类中也可以重写default方法
@Override
public String test3() {
return "实现类B重写的接口中的 默认方法";
}
}
class C implements A{
@Override
public void test1() {
}
@Override
public void test2() {
}
}
运行结果:
接口中的默认方法有两种使用方式:
1.实现类直接调用接口的默认方法
2.实现类重写接口的默认方法(有必要重写就重写,看需求)
默认方法对比于抽象方法,接口的扩展性就变强了。
3.静态方法
3.1语法规则
JDK8中为接口新增了静态方法,作用也是为了接口的扩展。
语法规则:
interface 接口名称{
修饰符 static 返回值类型 方法名{
方法体;
}
}
来看案例:
package com.bones.jdk8Learning_Interface;
/**
* @author : bones
* @version : 1.0
*/
public class Test01 {
public static void main(String[] args) {
A b = new B();
System.out.println(b.test3());
A c = new C();
System.out.println(c.test3());
//接口中的静态方法只能通过【接口名.方法名】来调用
System.out.println(A.test04());
}
}
interface A{
//在JDK1.8之前接口中只要新增了一个方法,所有实现类都需要重写这个方法,这样子不利于接口的扩展
void test1();
void test2();
//接口中定义的默认方法
public default String test3(){
return "hello ,interface default method exec!";
}
//接口中的静态方法,注意不能在子类中重写静态方法
public static String test04(){
return "interface static method";
}
}
class B implements A{
@Override
public void test1() {
}
@Override
public void test2() {
}
//实现类中也可以重写default方法
@Override
public String test3() {
return "实现类B重写的接口中的 默认方法";
}
}
class C implements A{
@Override
public void test1() {
}
@Override
public void test2() {
}
}
注意上面接口中 的静态方法以及调用:
public static String test04(){
return "interface static method";
}
A.test04()
运行结果:
3.2静态方法的使用
接口中的静态方法在实现类中是不能被重写的,调用只能通过接口类型来实现,即通过接口.方法名()
来调用.
所以不允许子类重写的方法可以考虑用接口中的静态方法去书写代码,支持子类重写或者不支持子类重写可以用默认方法。
4.接口中默认方法和静态方法的区别
1.默认方法通过实例调用,静态方法通过接口名.方法名()
调用
2.默认方法可以被继承,实现类可以直接调用接口默认方法,也可以重写接口默认方法;而静态方法不能被继承,实现类不能重写接口的静态方法,只能使用接口名调用