首先先我们来了解下Java中的权限修饰符。
Java 权限修饰符
在Java中提供了四种访问权限,使用不同的访问权限修饰符修饰时,被修饰的内容会有不同的访问权限。
public | protected | (default) | private | |
---|---|---|---|---|
同一类中 | √ | √ | √ | √ |
同一包中(子类与无关类) | √ | √ | √ | |
不同包的子类 | √ | √ | ||
不同包中的无关类 | √ |
可见,他们之间的大小关系为:
public > protected > (default) > private
注意事项:(default) 并不是关键字“default”,而是默认不写。
那下面进入本篇文章的正题。
1. Java外部类为什么不能用private修饰?
那我们先做一个假设,假如外部类可以被private
修饰,那么这个类是私有的,就不能被任何其它类使用,也就成为独立的文件,如果它作为单个文件运行,类加载怎么找到它呢,因为它对外不可见。同时,也失去了类的存在意义。因此外部类不能用private
修饰。
2. Java外部类为什么不能用protected修饰?
讨论这个问题之前,我们先强调一下protected
和(default)
修饰符之间的访问权限有什么不同。
protected
:同一类中、同一包中、不同包的子类。
(default)
:同一类中、同一包中。
可以看出不同点就在于protected
比(default)
多一个不同包的子类这么一个权限。
那我们还是来做一个假设,假如外部类可以被protected
修饰,那么不同包下的其他类是访问不到这个类的。有人说让他们建立父子类关系不就可以访问了吗,错!!!访问都访问不了你如何建立他们之间的父子类关系啊,你说对不对。
其次,你会发现不同包下的其他类是访问不到这个类的,那不就是(default)
修饰符的访问权限吗,功能都重复了!!!是不是毫无意义啊,所以外部类不能用protected
修饰。
总结:
- 被
protected
修饰的外部类之间是不能建立父子类关系的。 - 被
protected
或default
修饰的外部类其访问权限完全相同。