Fork me on GitHub

Java 9接口私有方法

前言

从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. 私有非静态方法不能在私有静态方法中使用。
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(); //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 – 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 TYPESINCE WHEN
public abstractJava 7
public defaultJava 8
public staticJava 8
privateJava 9
private staticJava 9



-------------文章结束啦 ~\(≧▽≦)/~ 感谢您的阅读-------------

SakuraTears wechat
扫一扫关注我的公众号
您的支持就是我创作的动力!
0%