Java接口中的私有方法
时间:2020-01-09 10:34:52 来源:igfitidea点击:
在Java 8中,在JavaDefault方法和静态方法的接口中添加了两个新功能。 Java 9新增了一项向Java接口添加私有方法的功能。
Java接口私有方法
可以使用private修饰符在Java接口中定义私有方法,方法与对Java类进行定义的方法相同。
private methodName(arguments){ .. .. }
我们可以在接口(从Java 9开始)中添加私有方法和私有静态方法。
为什么我们需要接口中的私有方法
随着默认和静态方法的加入,接口中出现了一个问题。如果默认方法或者静态方法中有通用代码怎么办?如果没有将通用代码暴露给实现类,就没有适当的方法将通用代码保存在单独的方法中。我们只能将通用代码保留在另一个默认或者静态方法中,但是默认情况下,接口中的所有方法都是公共的,因此将任何此类代码公开给实现类。
考虑以下情况,在Java 8中就是这种情况
public interface MyInterface { default void method1(){ commonCode(); System.out.println("In method 1"); } default void method2(){ commonCode(); System.out.println("In method 2"); } default void commonCode(){ System.out.println("Executing common code..."); } }
这里,接口中有两个默认方法method1()和method2()。两种方法都执行一些通用代码,因此将其保存在单独的默认方法中,以避免重复代码。
但是任何实现此接口的类都可以访问commonCode()方法,因为默认情况下所有方法在Java 8之前都是公共的。另一种选择是在这两种方法中保持相同的代码,从而具有代码冗余性。
public class MyClassImpl implements MyInterface { public static void main(String[] args) { MyClassImpl obj = new MyClassImpl(); obj.commonCode(); } }
从Java 9开始,通过在Java接口中包含私有方法,我们可以将此类代码保留在私有方法中,该私有方法仅在接口中可见。通过避免代码冗余来提高代码的可重用性,并通过保持代码的私有性来保持代码的安全。
与commonCode()相同的接口与私有方法相同(可能从Java 9开始)。
public interface MyInterface { default void method1(){ commonCode(); System.out.println("In method 1"); } default void method2(){ commonCode(); System.out.println("In method 2"); } private void commonCode(){ System.out.println("Executing common code..."); } }
现在,任何实现此接口的类都不能访问commonCode()方法,因为它是私有的。
Java接口中私有方法的规则
- 接口中的私有方法必须具有方法主体,不能仅仅将其声明为我们通常在接口中使用的普通公共抽象方法。如下声明私有方法会导致编译时错误"此方法需要主体而不是分号"。
private void commonCode();
- 从以上几点可以明显看出,private和abstract修饰符不能一起使用。
- 如果要从接口中的静态方法访问私有方法,则该方法必须是私有静态方法,因为我们不能静态引用非静态方法。例如,如果接口中包含以下代码,则将收到编译时错误"无法从MyInterface类型对非静态方法commonCode()进行静态引用"。
static void method3() { commonCode(); } private void commonCode(){ System.out.println("Executing common code..."); }
私有方法应编写如下,以便可以从静态上下文访问它。
private static void commonCode(){ System.out.println("Executing common code..."); }
- 也可以从非静态上下文中使用私有静态方法,这意味着可以从接口中的默认方法调用私有静态方法。
Java接口的演变
这是Java接口中添加的功能的摘要,以及Java接口中现在可以使用的所有功能。