接口中的私有方法
Java9中新增了带方法体的私有方法,这其实在Java8中就埋下了伏笔:Java8允许在接口中定义带方法体的默认方法和静态方法,这样可能就会引发一个问题:当两个默认方法或者静态方法中包含一段相同的代码实现时,程序必然考虑将这段实现代码抽取成一个共性方法,而这个共性方法是不需要让别人使用的,因此用私有给隐藏起来,这就是Java9增加私有方法的必然性
接口中的私有方法的定义格式1:
xxxxxxxxxx
private 返回值类型 方法名(参数列表){}
接口中的私有方法的定义格式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、静态方法只能调用私有的静态方法
接口中私有方法的练习
xxxxxxxxxx
package 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%");
}
//总结:默认方法既可以调用静态方法也可以调用非静态方法,静态方法只能调用静态方法
}
xxxxxxxxxx
package ch24;
public class a_4_2InterImpl implements a_4_1Inter{
//由于'a_4_1Inter'接口里面的是默认方法和静态方法,所以不需要在这里的实现类里面进行重写方法
//只有在接口写了抽象方法,才需要在这里的实现类里面重写方法
//所以,这里的实现类里面,什么都不用写
//创建这个实现类的目的是什么:
//因为:接口不能直接实例化,即不能直接创建对象,我们需要用到接口的实现类,该类即'a_4_2InterImpl'就是我们创建的实现类
//简单理解就是只是为了在操作类里面能够使用多态创建接口对象,创建的是接口的实现类对象
}
xxxxxxxxxx
package 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个方法里面内部的方法体有部分是一样的,我们可以把一样的方法体抽取出来,
//再定义一个私有方法,存放我们的一样的方法体,关于私有方法,也就是我们这节课学的内容
}
}