转载文章
原文链接 https://www.cnblogs.com/leolztang/p/6041222.html

对于java程序员来说,java的访问权限修饰词public、protected、default、private的区别和使用肯定都不是问题,这里也不再啰嗦了,反正度娘一搜就一大把。最近在整理java core的培训资料时,想到了几个关于权限修饰词的问题:

为什么类和接口(不考虑内部类和接口)不能使用private和protected修饰词,只能是public和default?
为什么接口的方法不能是private和protected,只能public(default可以写出来,但是编译之后自动转为了public)?
仔细想了一下,原因也不难。主要是虽然做了java不短的时间,这个问题还真没认真想过,实在惭愧。记下自己的想法,要多思考,不要成了框架的搬运工。

第一个问题:
private:

很好理解,类和接口如果定义成private,那么其他任何类都不能访问,这样的类写出来也没有意义。

protected:

这个问题用反证法比较好解释清楚,假设类B和A不在同一个包,A又是protected类, 那么B能访问A的前提是B是A的子类,而B能成为A的子类(或者说B能继承A)的前提又是B能访问A。这两个条件互为前提,无法实现。

第二个问题:
private:

接口是需要其他类实现的, 如果方法定义成private,那么其他任何类都不能访问。这样的方法即要求被实现,又对任何类不可见,这是无法实现的。

protected:

(1)假设public接口I有一个protected方法M,那么位于其他包的public类C就可以实现这个接口(方法M依然是protected)。那么C的同包类D调用方法M只能这样访问:

1
2
C c = new C();
c.M();
无法这样访问:

1
2
I c = new C();
c.M();
这样就失去了使用接口的重要意义:提供统一的接口,面向接口编程思想也无法体现。

(2)假设接口I是default的, 那么方法M是protected理论上是没有问题的,而且M也可以是default、public。至于为什么不让用protected,可能是出于简化修饰词的复杂度的目的(如果使用,需要区分接口是public的时候不能用,default接口则能用),至于default请参考(3).

default:

(3)假设public接口I有一个default方法M, 那么位于其他包的无法正常实现接口I,因为方法M对其不可见。

(4)假设default接口I有一个default方法M,那么方法M是default理论上是没有问题的,而且M也可以是proteced、public。可能出于和(2)所说不能用protected的相同原因,不能使用default。

因此,综合以上四点,接口方法只能使用public,既然只能用public,java编译器在你忘了在M前写public的时候干脆自动帮你转成public了。

转载文章原文链接 https://www.cnblogs.com/leolztang/p/6041222.html对于java程序员来说,java的访问权限修饰词public、protected、default、private的区别和使用肯定都不是问题,这里也不再啰嗦了,反正度娘一搜就一大把。最近在整理java core的培训资料时,想到了几个关于权限修饰词的问题:为什么类和接口(不考虑内部...
在传统的Java编程中,被广为人知的一个知识点是:java Interface 接口 不能 定义 private 私有 方法 。只允许我们定义public访问权限的 方法 、抽象 方法 或静态 方法 。但是从Java 9 开始,Interface 接口 中允许定义私有 方法 和私有静态 方法 。下面我们就来为大家介绍其语法规则,和为什么要有这样的设计。 其实在Java 8之前,还有另一个被广为人之的知识点: 接口 中所有的 方法 必须是abstract 抽象 方法 。但是,从java 8开始 接口 中可以包含非abstract 方法 ,如下文中的defa.
对于这个问题,一直没有仔细思考,今天整理一下: 对于顶级类(外部类)来说,只有两种修饰符:public和默认( default )。因为外部类的上一单元是包,所以外部类只有两个作用域:同包,任何位置。因此,只需要两种控制权限:包控制权限和公开访问权限,也就对应两种控制修饰符:public和默认( default )。 如果类 使用 private 修饰符,说明是个内部类。内部类的上一级是外部类,那
private (私有的)无法访问: 使用 private 关键字,就意味着被声明的成员或 方法 ,除了本类,其他任何类都无法访问。 public(公共的) 接口 访问权限: 使用 public关键字,就意味着被声明的成员或 方法 对所有类都是可以访问的。 protected (受保护的)继承访问权限: 使用 protected 关键字,就意味着被声明的成员或 方法 ,在子类以及相同包内的其他类都可以访问的。 default (... private (私有的)无法访问: 使用 private 关键字,就意味着被声明的成员或 方法 ,除了本类,其他任何类都无法访问。 public(公共的) 接口 访问权限: 使用 public关键字,就意味着被声明的成员或 方法 对所有类都是可以访问的。 protected (受保护的)继承访问权限: 使用 protec...
对于java程序员来说,java的访问权限修饰词public、 protected default private 的区别和 使用 肯定都不是问题,这里也不再啰嗦了,反正度娘一搜就一大把。最近在整理java core的培训资料时,想到了几个关于权限修饰词的问题: 为什么类和 接口 (不考虑内部类和 接口 不能 使用 private protected 修饰词,只能是public和 default ? 为什么 接口 的...
public、 default protected private 是Java中的访问修饰符,用于限定类、变量、 方法 和构造 方法 的访问范围。 public:public修饰的类、变量、 方法 和构造 方法 可以被任何其他类访问,包括不同包中的类。 default :当没有指定访问修饰符时, 使用 默认访问修饰符,即 default default 修饰的类、变量、 方法 和构造 方法 只能被同一包中的类访问。 protected protected 修饰的变量、 方法 和构造 方法 可以被同一包中的类访问,也可以被不同包中的子类访问。 private private 修饰的变量、 方法 和构造 方法 只能被同一类中的其他 方法 访问, 不能 被其他类访问。 需要注意的是,类只能 使用 public和 default 两种访问修饰符,而变量、 方法 和构造 方法 可以 使用 四种访问修饰符。