Java中4种权限修饰符修饰类、成员的分析

  • Post author:
  • Post category:java



前言:在最近做项目中,对权限修饰符又有了新的认知,对这块知识的脉络也越来越清晰,来博客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所修饰。

首先从成员的权限修饰符我们知道,该成员在包内和包外的所有类中都可见,但是成员所在类的权限修饰符限定了该类仅在同一个包中可见。

所以最终只能在同一个包中的类里面,创建该成员所在类的对象进行成员的调用。



版权声明:本文为u013771764原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。