转载文章
原文链接
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
两种访问修饰符,而变量、
方法
和构造
方法
可以
使用
四种访问修饰符。