接口中的私有方法
Java9中新增了带方法体的私有方法,这其实在Java8中就埋下了伏笔:Java8允许在接口中定义带方法体的默认方法和静态方法,这样可能就会引发一个问题:当两个默认方法或者静态方法中包含一段相同的代码实现时,程序必然考虑将这段实现代码抽取成一个共性方法,而这个共性方法是不需要让别人使用的,因此用私有给隐藏起来,这就是Java9增加私有方法的必然性
接口中的私有方法的定义格式1:
xxxxxxxxxxprivate 返回值类型 方法名(参数列表){}接口中的私有方法的定义格式2:
private static 返回值类型 方法名(参数列表){}
需求: 1、定义一个接口Inter,里面有四个方法,分别是2个默认方法和2和静态方法,如下 default void show1(){}、default void show2(){}、static void method1(){}、static void method2(){} 2、定义接口的一个实现类InterImpl 3、定义测试类,在测试类的main方法中,按照多态的方式创建对象并使用
接口中的私有方法的注意事项: 1、默认方法可以调用私有的静态方法和非静态方法 2、静态方法只能调用私有的静态方法
接口中私有方法的练习
xxxxxxxxxxpackage ch24;
public interface a_4_1Inter {
//默认方法 default void show1(){ System.out.println("默认-show1开始执行"); //System.out.println("20%"); //System.out.println("60%"); //System.out.println("90%"); //用最下面的非静态私有方法show99代替上面的3个输出语句 show99(); //尝试一下默认方法能否调用最下面的静态方法 show999();//答案是可以的 System.out.println("默认-show1执行结束"); System.out.println("-----------------------"); } //默认方法 default void show2(){ System.out.println("默认-show2开始执行"); //System.out.println("20%"); //System.out.println("60%"); //System.out.println("90%"); //用最下面的非静态私有方法show99代替上面的3个输出语句 show99(); System.out.println("默认-show2执行结束"); System.out.println("-----------------------"); } //静态方法 static void method1(){ System.out.println("静态-method1开始执行"); //System.out.println("20%"); //System.out.println("60%"); //System.out.println("90%"); //由于最下面的私有方法show99是非静态的,而这里的method1是静态的,规定静态方法不能调用非静态方法,所以这里是调用不了show99方法的 //解决:再定义一个带static关键字的私有方法 show999(); System.out.println("静态-method1执行结束"); System.out.println("-----------------------"); } //静态方法 static void method2(){ System.out.println("静态-method2开始执行"); //System.out.println("20%"); //System.out.println("60%"); //System.out.println("90%"); //由于最下面的私有方法show99是非静态的,而这里的method1是静态的,规定静态方法不能调用非静态方法,所以这里是调用不了show99方法的 //解决:再定义一个带static关键字的私有方法 show999(); System.out.println("静态-method2执行结束"); System.out.println("-----------------------"); }
//------------------------------------------------------------------------------------------------------------
//在下面写两个方法,作用是被上面的4个方法来调用
//通过观察上面的4个方法,发现内部的方法体有部分是一样的,我们可以把一样的方法体抽取出来, //再定义一个私有方法show99,存放我们的一样的方法体,关于私有方法,也就是我们这节课学的内容 private void show99(){ System.out.println("20%"); System.out.println("60%"); System.out.println("90%"); } //上面那个show99方法是非静态的私有方法,只能被最上面的私有方法调用,不能被静态方法调用 //思考:如何把静态方法那里相同的方法体抽取出来呢 //解决:在私有方法里面加上static关键字,就变成静态的私有方法了 private static void show999(){ System.out.println("20%"); System.out.println("60%"); System.out.println("90%"); }
//总结:默认方法既可以调用静态方法也可以调用非静态方法,静态方法只能调用静态方法
}xxxxxxxxxxpackage ch24;
public class a_4_2InterImpl implements a_4_1Inter{
//由于'a_4_1Inter'接口里面的是默认方法和静态方法,所以不需要在这里的实现类里面进行重写方法 //只有在接口写了抽象方法,才需要在这里的实现类里面重写方法
//所以,这里的实现类里面,什么都不用写
//创建这个实现类的目的是什么: //因为:接口不能直接实例化,即不能直接创建对象,我们需要用到接口的实现类,该类即'a_4_2InterImpl'就是我们创建的实现类 //简单理解就是只是为了在操作类里面能够使用多态创建接口对象,创建的是接口的实现类对象
}xxxxxxxxxxpackage ch24;
public class a_4_3测试 {
public static void main(String[] args) {
a_4_1Inter i = new a_4_2InterImpl();
//在我们的'a_4_1Inter接口有2个默认方法和2个静态方法
//默认方法需要通过接口的实现类对象来调用,即通过i来调用 i.show1(); i.show2();
//静态方法需要通过接口名来调用,即通过a_4_1Inter来调用 a_4_1Inter.method1(); a_4_1Inter.method2();
//实现类即'a_4_2InterImpl'里面没有重写接口的方法,所以上面调用的直接就是接口里面的方法内容 //如果重写了,那么所以上面调用的就是重写之后的方法内容了
//---------------------------------------------------------------------------------------
//通过观察接口即'a_4_1Inter',我们可以发现,接口的4个方法里面内部的方法体有部分是一样的,我们可以把一样的方法体抽取出来, //再定义一个私有方法,存放我们的一样的方法体,关于私有方法,也就是我们这节课学的内容
}}