前言:在最近做项目中,对权限修饰符又有了新的认知,对这块知识的脉络也越来越清晰,来博客mark一下。
这篇博客是对前两篇博客的一个总结提炼(https://blog.csdn.net/u013771764/article/details/81226908与https://blog.csdn.net/u013771764/article/details/82226855),需要了解提炼背景的朋友可以通过先看看前两篇的背景介绍。
(ps.文中所说的default修饰指的是不加任何权限修饰符。此外,为了叙述的方便,本文中涉及的类指的是外部类,涉及的成员指的是非静态成员方法)
1、类的2种权限修饰符分析
从之前博客的分析中我们知道,外部类仅能被public和default修饰。当被default修饰时,该类仅在包内可见,在包外不可访问;而被public修饰时,则不仅能在包内可见,在包外同样可见。
换句话说就是,类的两种权限修饰符的访问权限所讨论的维度是它的上一级:包。决定类仅在包内可见(default修饰时)还是包内包外都可见(public修饰时)!
2、成员的4种权限修饰符分析
1)private修饰的成员:该成员仅对自己这个类可见。
2)default修饰的成员:该成员对同一个包中的类都可见。
3)protected修饰的成员:该成员除了对同一个包中的类可见外,还对包外的子类(成员所在类的子类)可见。
这里要注意一个细节!protected这个权限修饰符比较特殊的一点在于,protected是专为子类提供的修饰符。也就是说,在包外的子类中(假设叫这个子类为Class Son),即使是成员所在类的对象也无法访问被protected修饰的成员,需要用Son类的对象进行访问(成员所在类如果有多个子类,别的子类的对象也不行)。
我之前看过一篇博客,讲述了Object类中clone方法的使用,clone方法就是一个被protected修饰符所修饰的方法。博主开篇就表明之前因为对protected修饰符的理解产生了偏差,从而出bug了,感兴趣的朋友可以看下这篇博客:https://blog.csdn.net/three__stones/article/details/50953849。
4)public修饰的成员:该成员不仅对同一个包中的类可见,在包外的类中也都可见。
换句话说就是,成员的4种权限修饰符的访问权限所讨论的维度是它的上一级:类。决定成员在哪些类中是可见的。
3、类的权限修饰符与成员的权限修饰符的关联
我们知道在进行成员调用的时候,需要用该成员所在类的对象进行调用。结合权限修饰符的话,我们可以这样分析一个成员的调用:
1)先看成员的权限修饰符,这样可以知道成员在哪些类中是可见的。
2)再看该成员所在类的修饰符,这样可以知道该类的对象是仅能包内可见还是包外也可见。
3)根据上述两者,取范围的交集。在交集所限定的范围,进行成员的调用。
上述可能比较抽象,我们举一个例子来分析。
例如某个成员被public所修饰,而该成员所在类是被default所修饰。
首先从成员的权限修饰符我们知道,该成员在包内和包外的所有类中都可见,但是成员所在类的权限修饰符限定了该类仅在同一个包中可见。
所以最终只能在同一个包中的类里面,创建该成员所在类的对象进行成员的调用。