Java中接口能否用默认访问修饰符?未指定时是否为public abstract?
Java接口的默认访问修饰符解析
嘿,这个问题问到点子上了,很多刚接触Java接口的开发者都会搞混这两个点,我给你一步步讲清楚:
1. 接口能不能用默认访问修饰符(省略不写)?
当然可以,但得分两种场景:
- 顶级接口(直接写在
.java文件里,不是嵌套在类/其他接口内部的接口):只能用public或者默认访问权限(省略修饰符),默认权限意味着这个接口只能被同一个包下的类访问。 - 成员接口(嵌套在类或者其他接口里的接口):除了
public和默认权限,还能使用protected甚至private(不过private成员接口只能在所属类内部使用,很少见),省略修饰符时同样是默认的包私有权限。
举个例子:
// 顶级接口,默认包私有,只能同包类访问 interface DefaultAccessInterface { void doSomething(); } public class TestClass { // 成员接口,默认包私有 interface InnerDefaultInterface { void innerMethod(); } }
2. 省略修饰符时,接口是不是默认public abstract?
这里要拆成两部分看:
abstract是默认的:不管你显式写不写abstract,所有接口本质上都是抽象的——毕竟接口就是用来被实现的,不能直接实例化,而且接口里的所有抽象方法默认也是public abstract(Java 8及以后的默认方法、静态方法除外)。public不是默认的:如果省略了访问修饰符,接口的访问权限是默认的包私有,而不是public。只有当你显式加上public关键字时,接口才是公共可访问的。
比如这个常见误区:很多人以为顶级接口默认是public,但实际上只有当你显式声明public interface时,它才是公共的,否则只能被同包类访问。
总结一下:
- 接口可以用默认访问修饰符(省略不写),权限为包私有;
- 省略修饰符时,接口默认是
[默认包私有] abstract,而非public abstract。
内容的提问来源于stack exchange,提问作者rusmusus
相关产品推荐
相关产品推荐

