Java接口中的方法
Java8之前
接口中的方法全部是抽象方法,默认public abstract 修饰,也只能是public abstract修饰,public abstract可以省略
Java8及之后
接口中的方法有抽象方法(abstract),默认方法(default),静态方法(static)
接口中所有方法的访问权限修饰符都是public,也只能是public,public 可以省略
抽象方法
访问权限修饰符是public,public可省略
abstract修饰,abstract 可省略
有返回值类型,有方法名,有参数列表,没有方法体
静态方法
访问权限修饰符是public,public可以省略
static修饰
有返回值类型,有方法名,有参数列表,有方法体
只能接口本身调用:接口名.方法名
不能够被子接口继承
不能够被实现类覆写及直接调用
默认方法:方法的默认实现,实现类/接口可以选择性覆写此方法
default修饰
有返回值类型,有方法名,有参数列表,有方法体
不能够被接口本身调用,需要接口的实例(实现类对象)来调用
可以被子接口继承、覆写或者直接调用
可以被实现类覆写及直接调用
为什么接口中的方法没有写修饰符时修饰符就是public,为什么不是默认修饰符呢?
我们可以做一个实验
首先要知道的是访问权限修饰符的权限范围
由上图可知,不同包中默认访问权限修饰符是不能访问的,所以我们可以在不同包的测试类中去访问方法,如果能访问成功则表示此方法是public修饰的。
注意上述接口所在的包,也可以看到所有的方法都没有写访问权限修饰符
而在另一个包中可以访问到静态方法test,证明没有写访问权限修饰符的情况下默认是public。(这里就没有创建实例对象去调用抽象方法和默认方法了,测试的结果都一样)
接口中的访问权限修饰符只能是public吗?
答案是肯定的,接口的作用就是为了规范方法签名,提供给实现类或者接口实现,所以为了实现的方便,接口必须是公共的(可以和上述测试方法一样在不同包中测试能否访问到该接口就能知道接口不写访问权限修饰符时,接口的访问权限修饰符是什么),接口中的方法也必须是公共的
上述已经测试过了不写访问权限修饰符情况下,真正的访问权限修饰符是默认还是public,答案是public,那么访问权限修饰符可以是private或者protected吗?
答案是不能,目前不知道底层是如何限制接口的访问修饰符只能是public的,但是实验证明只能是public,private和protected都会报错(除了静态方法)。
静态方法的访问权限修饰符可以是public和private,不写访问权限修饰符的情况下就是public,不能使用protected。
为什么静态方法的访问权限修饰符可以为private,不能为protected,个人认为因为接口的静态方法只能接口本身调用,不能被子接口继承,也不能被实现类覆写,那么这个方法就属于接口本身,所以在本接口中调用就行,所以可以用private修饰。至于为什么不能用protected修饰,个人认为protected设定就是用来对子类继承父类的属性和方法进行权限限制的,而接口中不存在子类父类的关系,所以不能用protected。