Java 9 - 接口中的私有方法

时间:2020-02-23 14:34:55  来源:igfitidea点击:

在这个主题中,我们将讨论 privateprivate static methods在接口内。

Java中的接口是用于实现抽象的概念。

在java的早期版本中 interface只能包含抽象方法和常量,直到Java 8允许添加默认和静态方法。

在Java 9中, interface允许创建 private and private static methods
它意味着现在一个接口可以具有以下内容:

  • 抽象方法
  • 恒定变量
  • 默认方法(在Java 8中添加)
  • 静态方法(在Java 8中添加)
  • 私有方法(在Java 9中添加)
  • 私有静态方法(在Java 9中添加)

现在,让我们了解什么是私有方法以及为什么重要。

接口私有方法

一个 private method在接口内声明类似于在类中声明。
它被声明使用私有访问修饰符来保持其限制为接口。

这些方法无法在外面访问 interface并不继承到接口或者实现类。

添加私有方法的主要目的是在接口中共享非抽象方法之间的常见代码。
让我们看一个例子。

interface Drinkable{
    default void breakTime() {
        coffee();
    }
    private void coffee() {
        System.out.println("Let's have a Coffee");
    }
}
 
public class Main implements Drinkable{
    public static void main(String[] args){
        Main main = new Main();
        main.breakTime();
    }
}

输出:

Let's have a Coffee

接口私有静态方法

与私有实例方法一样,私有方法也可以是静态的。

无法从接口外部访问私有静态方法,只能在默认或者静态方法内访问。

interface Drinkable{
    default void breakTime() {
        coffee();
        tea();
    }
    private void coffee() {
        System.out.println("Let's have a Coffee");
    }
    private static void tea() {
        System.out.println("Let's have a Tea");
    }
}
 
public class Main implements Drinkable{
    public static void main(String[] args){
        Main main = new Main();
        main.breakTime();
    }
}

输出:

Let's have a Coffee
Let's have a Tea

如果我们要在之间分享代码 instance methods可以使用私有实例方法和私有静态方法。
但如果我们想在之间分享代码 static methods,仅使用私有静态方法。
请参阅,如果我们尝试访问a,会发生什么 private method在A内 static method

interface Drinkable{
    static void breakTime() {
        coffee(); //Error : Cannot make a static reference to the non-static method
    }
 
    private void coffee() {
        System.out.println("Let's have a Coffee");
    }
}
 
public class Main implements Drinkable{
    public static void main(String[] args){
        Main main = new Main();
        //main.breakTime();
    }
}

输出:

Error : Cannot make a static reference to the non-static method

要记住的关键点

  • Interface private methods必须有实施机构;他们不能被声明为抽象方法。
  • 一个 static method只能拨打私有静态方法,但默认方法可以调用静态和非静态(实例)私有方法。
  • interface private methods支持在非抽象方法之间共享公共代码(默认,静态和私有)。