# 接口中的私有方法 – Java 9

> 原文： [https://howtodoinjava.com/java9/java9-private-interface-methods/](https://howtodoinjava.com/java9/java9-private-interface-methods/)

从 Java 9 开始，您可以在接口中包含私有方法。 使用私有方法，现在也可以在接口中实现[封装](//howtodoinjava.com/object-oriented/encapsulation-in-java-and-its-relation-with-abstraction/)。

在此 Java 9 教程中，我们将详细了解**接口私有方法**。

```java
Table of Contents

Interfaces till Java 7
Static and defaults methods since Java 8
Private methods since java 9
Java 9 Private Interface Method Example
Summary
```

## Java 7 接口

在 Java 7 和所有早期版本中，接口非常简单。 它们只能包含**公共抽象**方法。 这些接口方法必须由选择实现接口的类实现。

```java
public interface CustomInterface {
    public abstract void method();
}

public class CustomClass implements CustomInterface {
    @Override
    public void method() {
        System.out.println("Hello World");
    }

    public static void main(String[] args){
        CustomInterface instance = new CustomClass();
        instance.method();
    }
}

Output:

Hello World

```

## 自 Java 8 以来的静态方法和默认方法

在 [Java 8](//howtodoinjava.com/java-8-tutorial/) 中，除了**公共抽象**方法之外，您还可以使用**公共静态**方法和**公共默认**方法。

```java
public interface CustomInterface {

    public abstract void method1();

    public default void method2() {
        System.out.println("default method");
    }

    public static void method3() {
        System.out.println("static method");
    }
}

public class CustomClass implements CustomInterface {

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

    public static void main(String[] args){
        CustomInterface instance = new CustomClass();
        instance.method1();
        instance.method2();
        CustomInterface.method3();
    }
}

Output:

abstract method
default method
static method

```

[访问修饰符](//howtodoinjava.com/object-directional/java-access-modifiers/)`public`在以上所有接口方法声明中都是可选的。 我添加它们只是为了提高可读性。

## 自 Java 9 以来的私有方法

从 Java 9 开始，您将可以在接口中添加**私有方法**和**私有静态方法**。

这些私有方法将改善接口内部的代码可重用性。 举例来说，如果需要两个默认方法来共享代码，则可以使用私有接口方法来共享代码，但不必将该私有方法暴露给实现类。

在接口中使用私有方法有四个规则：

1.  接口私有方法不能是抽象的。
2.  私有方法只能在接口内部使用。
3.  私有静态方法可以在其他静态和非静态接口方法中使用。
4.  私有非静态方法不能在私有静态方法内部使用。

```java
public interface CustomInterface {

    public abstract void method1();

    public default void method2() {
        method4();  //private method inside default method
        method5();  //static method inside other non-static method
        System.out.println("default method");
    }

    public static void method3() {
        method5(); //static method inside other static method
        System.out.println("static method");
    }

    private void method4(){
        System.out.println("private method");
    } 

    private static void method5(){
        System.out.println("private static method");
    } 
}

public class CustomClass implements CustomInterface {

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

    public static void main(String[] args){
        CustomInterface instance = new CustomClass();
        instance.method1();
        instance.method2();
        CustomInterface.method3();
    }
}

Output:

abstract method
private method
private static method
default method
private static method
static method

```

## Java 9 接口私有方法示例

让我们看一个演示，以了解接口私有方法的用法。

我正在创建具有两个函数的计算器类。 第一个函数将接受一些整数并将所有偶数相加。 第二个函数将接受一些整数并将所有奇数相加。

#### `CustomCalculator.java` – 接口

```java
import java.util.function.IntPredicate;
import java.util.stream.IntStream;

public interface CustomCalculator 
{
    default int addEvenNumbers(int... nums) {
        return add(n -> n % 2 == 0, nums);
    }

    default int addOddNumbers(int... nums) {
        return add(n -> n % 2 != 0, nums);
    }

    private int add(IntPredicate predicate, int... nums) { 
        return IntStream.of(nums)
                .filter(predicate)
                .sum();
    }
}

```

#### `Main.java` – 类

```java
public class Main implements CustomCalculator {

    public static void main(String[] args) {
        CustomCalculator demo = new Main();

        int sumOfEvens = demo.addEvenNumbers(1,2,3,4,5,6,7,8,9);
        System.out.println(sumOfEvens);

        int sumOfOdds = demo.addOddNumbers(1,2,3,4,5,6,7,8,9);
        System.out.println(sumOfOdds);
    } 
}

Output:

20
25

```

## 总结

简而言之， **java 9 私有接口方法**可以是静态的也可以是实例的。 在这两种情况下，私有方法都不会被子接口或实现继承。 它们主要是为了提高代码仅在接口内的可重用性，从而改善封装。

让我们回顾一下 Java 9 中所有允许的方法类型。

| 方法类型 | 从何时起 |
| --- | --- |
| 公共抽象 | Java 7 |
| 公共默认 | Java 8 |
| 公共静态 | Java 8 |
| 私有 | Java 9 |
| 私有静态 | Java 9 |

将您的问题放在评论部分中。

学习愉快！

参考： [JEP 213](https://openjdk.java.net/jeps/213)

[下载源码](//howtodoinjava.com/wp-content/downloads/Java9-interface-private-methods.zip)