前言
从Java 9开始,我们可以在接口中包含私有方法。使用私有方法,现在在接口中也可以进行封装。
在本文中,我们将详细了解接口私有方法。
正文
Java 7之前的接口
在Java 7和所有早期版本中,接口非常简单。它们只能包含公共抽象方法(public abstract method)。这些接口方法必须由选择实现接口的类来实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 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开始,除了公共抽象方法之外,接口还可以拥有公共静态方法(public static method)和默认方法(public default method)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| 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
|
在以上接口方法声明中,访问修饰符“public”是可选的。添加它们只是为了提高可读性。
Java 9的接口
从Java 9开始,我们将能够在接口中添加私有方法(private methods)和私有静态方法(private static method)。
这些私有方法将提高接口内部的代码可重用性。
例如,如果两个默认方法需要共享代码,那么提供一个私有接口方法即可,但是不会将这个私有方法暴露给它的实现类。
在接口中使用私有方法有四个规则:
- 私有接口方法不能是抽象的。
- 私有方法只能在接口内部使用。
- 私有静态方法可以在其他静态和非静态接口方法中使用。
- 私有非静态方法不能在私有静态方法中使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| public interface CustomInterface { public abstract void method1(); public default void method2() { method4(); method5(); System.out.println("default method"); } public static void method3() { method5(); 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 – Interface
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 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 – Class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 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中允许的所有方法类型。
METHOD TYPE | SINCE WHEN |
---|
public abstract | Java 7 |
public default | Java 8 |
public static | Java 8 |
private | Java 9 |
private static | Java 9 |