1.java修饰符访问权限--public,protected,private,default(package,friendly)
被public修饰的类、类属变量及方法,可以被包内及包外的任何类访问;
被protected修饰的类、类属变量及方法,包内的任何类,及包外的那些继承了此类的子类才能访问;
被private的修饰的类、类属变量及方法,包内包外的任何类均不能访问;
如果一个类、类属变量及方法不以这三种修饰符来修饰,它就是default,也可以称之为是friendly类型的或者package类型,
那么包内的任何类都可以访问它,而包外的任何类都不能访问它,这也包括包外继承了此类的子类,因此,这种类、类属变量及方法对包内的其他类是友好的,开放的,而对包外的其他类是关闭的。
2.private和protected不能修饰类和接口的原因之我见
在使用eclipse作为IDE,在创建类或者接口时,或看到这样的情况:
也就是说private和protected修饰符不能修饰类和接口。这是为什么呢?笔者对此做了分析如下
(1)根据private的访问权限限制:private修饰的类和接口不能被其他任何类和接口访问。那么我们定义这样的一个类或者接口有何意义呢?因此不要也罢。
(2)根据protected的访问权限限制:protected修饰的类只能被同一个包中的类或者其子类来访问。那么我们举个例子:假设类B和A不在同一个包,A又是protected类, 如果B想访问A的则B只能是A的子类,而B如果要成为A的子类(或者说B能继承A)的前提又是B能访问A。这两个条件互为前提,无法实现。
3.接口的方法不能使用private,protected,default(friendly)修饰符修饰
接口的方法一定是要被其他类来实现的,否则就失去了接口存在的意义。既然需要被其他类来实现,所以接口不能被private,protected修饰,原因如下:
1)假设public接口I有一个protected方法M,那么位于其他包的public类C就可以实现这个接口(方法M依然是protected)。那么C的同包类D调用方法M只能这样访问:
C c = new C();
c.M();
无法这样访问:
I c = new C();
c.M();
如果接口I被多个类C1,C2...实现,其他类再根据不同情况来选择调用C1,C2,...的方法M时,就无法提供统一的接口了。本来这一用一个接口访问M方法,callM(I c),现在要根据不同的实现类C1,C2,...来提供多个接口。这样就失去了使用接口的重要意义:提供统一的接口,面向接口编程思想也无法体现。
(2)假设接口I是default的, 那么方法M是protected理论上是没有问题的,而且M也可以是default、public。至于为什么不让用protected:既然只能被本包中的类实现,其他包不能实现,这就失去了使用接口的重要意义:提供统一的接口。既然public既能被本包类访问,也能被其他包中的类访问,何乐不为呢。呵呵
(3)假设public接口I有一个default方法M, 那么位于其他包的无法正常实现接口I,因为方法M对其不可见。
(4)假设default接口I有一个default方法M,那么方法M是default理论上是没有问题的,而且M也可以是proteced、public。可能出于和(2)所说不能用protected的相同原因,不能使用default。