接口在我们之前的印象中,它是所有方法都没有方法体的这么一个形式出现,接口中可以有抽象方法(public abstract修饰)和常量(public static final修饰),但是到了jdk8版本的时候,接口中可以有方法体的方法,它们分别是默认方法和静态方法,之后到了jdk9的时候又出现了私有方法。
默认方法:
主要解决的问题:当接口中有多个方法的时候,有的业务可能不需要接口中的全部方法,而只是需要部分方法,但是jdk8之前的版本是必须将所有的方法进行一个实现,这样就显得非常不友好,于是乎就出现了默认方法,他的格式:
public default 返回值类型 方法名(参数列表){ 方法体 }
它不是抽象方法,有方法体,同时不强制被重写,但是可以被重写,只是重写的时候需要去掉default关键字,在idea中写默认方法的时候,发现public是灰色显示的,说明他是可以被省略的,default则不能省略。
应用:
package com.csf;
jdk8
//接口
public interface DefaultInterface {
void show1();
default void show3(){
System.out.println("show3");
}
}
//实现
public class DefaultInterImpl implements DefaultInterface{
@Override
public void show1() {
System.out.println("show1");
}
//可被重写,不重写的话直接调用接口中的default方法
@Override
public void show3() {
System.out.println("super show3");
}
}
//测试
public class DefaultDemo {
public static void main(String[] args) {
DefaultInterface defaultInterface = new DefaultInterImpl();
defaultInterface.show3();
defaultInterface.show1();
}
}
静态方法
格式:
public static 返回值类型 方法名(参数列表){ 方法体 }
同样,它有方法体,但是在调用接口中静态方法的时候不是通过实现类名或者对象名调用的,而是只能通过接口名调用,就跟普通静态方法一样,通过类名调用。它的public修饰可以省略,但是static不能被省略。
应用:
package com.csf;
//jdk8
//接口
public interface StaticInterface {
void staticMethod1();
// default方法可以被实现类重写,如果不重写默认调用接口中的方法
default void staticMethod2(){
System.out.println("staticMethod2");
}
// static方法只能通过接口名进行调用
static void staticMethod3(){
System.out.println("staticMethod3");
}
}
//实现类
public class StaticInterfaceimpl implements StaticInterface{
@Override
public void staticMethod1() {
System.out.println("staticMethod1");
}
}
//测试
public class StaticInterfaceDemo {
public static void main(String[] args) {
StaticInterface staticInterface = new StaticInterfaceimpl();
staticInterface.staticMethod1();
staticInterface.staticMethod2();
// 只能通过接口名来进行调用
StaticInterface.staticMethod3();
}
}
私有方法:
主要解决的问题和产生原因,静态方法在jdk9中出现,其实jdk8已经为它的出现埋下了伏笔,因为jdk8中,咱们已经有了默认方法和静态方法,如果这两个方法体中存在大量一样的代码,那么我们是否需要将他们抽取出来进行统一管理,并且减少代码重复率,而且这个抽取出来的共性方法是不需要外部使用的,所以可以用私有方法隐藏起来。
格式:
private 返回值类型 方法名(参数列表){ 方法体 }
private static 返回值类型 方法名(参数列表){ 方法体 }
需要注意的是:默认方法可以调用私有的静态方法和非静态方法,而静态方法只能调用私有的静态方法。
应用:
package com.csf;
public interface PrivateInter {
default void method1(){
System.out.println("method1");
bigPerson();
// System.out.println("大人,老臣做不到啊");
}
default void method2(){
System.out.println("method2");
bigPerson();
// System.out.println("大人,老臣做不到啊");
}
//私有方法可以针对默认方法和静态方法中共性的输入输出进行集中管理,通过调用来减少代码的书写
private void bigPerson(){
System.out.println("大人,老臣做不到啊");
}
static void show1(){
System.out.println("show1");
bigPerson1();
// System.out.println("大人,老臣做不到啊");
}
static void show2(){
System.out.println("show2");
bigPerson1();
// System.out.println("大人,老臣做不到啊");
}
private static void bigPerson1(){
System.out.println("大人,老臣做不到啊");
}
}