一、接口的组成有:

        常量 public static final修饰

        抽象方法 public abstract修饰

        默认方法(Java8)

        静态方法(Java9)

        私有方法(Java9)

二、接口中的默认方法

接口中默认方法格式定义:

public default 返回值类型 方法名(参数列表){}

范例:public default void show3(){}

注意事项:接口中默认方法不是抽象方法,所以不强制被重写,但是可以被重写,重写的时候去掉关键字default就行了。public可以省略,但是default不可以被省略。 

什么时候使用,当新创建的类既要实现接口中的方法,又要实现新的方法时,在接口中添加默认方法。新创建的类重写该方法即可。

代码略…………

三、接口中静态方法

接口中定义方法格式:public static 返回值类型 方法名(参数列表){}

范例:public static void show()

注意事项:静态方法只能通过接口名调用,不能通过实现类名或者对象名调用。public可以省略,但是static不可以省略。

package staticFunction;

public interface Inter {
    void show();
    default void method(){
        System.out.println("default");
    }
    static void test(){
        System.out.println("test");
    }
}
package staticFunction;

public class InterImpl implements Inter{

    @Override
    public void show() {
        System.out.println("InterImpl show");
    }

    @Override
    public void method() {
        System.out.println("InterImpl method");
    }

    //test静态方法无法在实现类中重写

}
package staticFunction;
/*
    1、定义一个接口Inter,里面有三个方法:一个是抽象方法,一个是默认方法,一个是静态方法。
        void show();
        default void method();
        static void test();
    2、定义一个接口的实现类
        InterImpl
    3、定义一个测试类
        在主方法中按照多态的方式创建对象并使用
    总结:接口中的静态方法只能使用接口调用,实现类无法重写,无法调用。
 */
public class InterDemo {

    public static void main(String[] args) {
        Inter inter = new InterImpl();

        inter.method();
        inter.show();
        //inter.test();   无法使用实现体类调用接口中的方法
        Inter.test(); //使用接口调用接口的静态方法
    }
}

四、接口中静态方法

Java9中新增了带方法体的私有方法,这其实在java8中埋下了伏笔:java8允许在接口中定义带方法体的默认方法和静态方法,这样会引发一个问题:当两个静态方法或者私有方法中包含同一段代码时,程序必然考虑将这段代码抽取成一个方法,而这个共性的方法是不能让别人知道的,因此需要用私有隐藏起来,这是java9增加私有地必然性。

接口中私有方法定义格式:

package privateFunction;

public interface Inter {
    default void show1(){
        System.out.println("show1开始");
//        System.out.println("我爱我的祖国!");
//        System.out.println("我爱首都北京!");
        show();
        //method(); //调用静态私有方法
        System.out.println("show1结束!");
    }

    default void show2(){
        System.out.println("show2开始");
//        System.out.println("我爱我的祖国!");
//        System.out.println("我爱首都北京!");
        show();
        //method(); //调用静态私有方法
        System.out.println("show2结束!");
    }

    private void show(){
        System.out.println("我爱我的祖国!");
        System.out.println("我爱首都北京!");
    }

    static void method1(){
        System.out.println("method1开始");
//        System.out.println("我爱我的祖国!");
//        System.out.println("我爱首都北京!");
        //show();//不能使用非静态方法
        method();
        System.out.println("method1结束!");
    }

    static void method2(){
        System.out.println("method2开始");
//        System.out.println("我爱我的祖国!");
//        System.out.println("我爱首都北京!");
        //show();//不能使用非静态方法
        method();
        System.out.println("method2结束!");

    }

    static  void method(){
        System.out.println("我爱我的祖国!");
        System.out.println("我爱首都北京!");
    }


}
package privateFunction;

public class InterImpl implements Inter{
    @Override
    public void show1() {
        Inter.super.show1();
    }

    @Override
    public void show2() {
        Inter.super.show2();
    }


}
package privateFunction;
/*
    1、定义一个接口Inter,里面有四个方法:两个是默认方法,两个是静态方法。
        default void show1()
        default void show2()
        static void method1()
        static void method2()
    2、定义接口的一个实现类
        InterImpl
    3、定义测试类:
        InterDemo
        在主方法中按照多态的方式创建对象并使用
    总结:接口中静态方法只能调用私有静态方法,非静态方法则既可以调用私有静态方法也可以调用默认方法
 */
public class InterDemo {
    public static void main(String[] args) {
        Inter inter = new InterImpl();
        inter.show1();
        inter.show2();

        Inter.method1();
        Inter.method2();
    }
}