所谓“万变不离其宗”,“宗”即本,本质。不管如何错综变化只要抓住本质,就能拨开云雾。这句话反过来也可以这样说,只要摸透本质就可幻化无穷。上层建筑要想建的高建的漂亮,底层必须牢固可靠。所以打好底层能力是能爬的高的关键。这里我们不提智商,性格,思维模式,沟通表达啊这些底层,我们不说那些抽象宏观的东西,这里我们聚焦于一些具体的技术。学技术也一样,先弄懂本质基础,才能玩的溜。基础需要不断的巩固加强,此系列的文章我会写一些自己对Java的基础知识的理解认知。
此篇的主题为Java的权限管理。
首先一个事物存在必定有存在的理由,咱们先要问一个问题,为什么要设置权限管理?回答这样的问题思路也简单,所谓“成年人只看利弊,小孩儿才分对错”,只要看这么做有什么好处就行。让我们先把关于权限的修饰符一一列出。
修饰符 | 可修饰的成员 | 权限 |
private | 域,方法 | 仅类内可见 |
default | 域,方法,类 | 同包类可见 |
protected | 域,方法 | 同包类,包外子类可见 |
public | 域,方法,类 | 所有可见 |
我们举个例子来解释好处,下面是一个可以提供给int数组排序服务的ArraySort类:
public class ArraySort { public int[] Sort(int[] arr){ return bubble_sort(arr); } private int[] bubble_sort(int[] arr) { int arr_len = arr.length; byte flag; for (int i = 1; i <= arr_len - 1; i++) { flag = 1; for (int j = 0; j < arr_len - i; j++) { if (arr[j] > arr[j + 1]) { swap(arr, j, j + 1); flag = 0; } } if(flag == 1) { break; } } return arr; } private void swap(int[] arr, int i, int j) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } }
既然这个类只提供排序服务,那么我就只开放Sort(int[] arr)这个方法就好,其他的对使用者没用,都开放了也显繁杂会给使用者造成烦扰,所有其他方法我都用private去修饰了,此乃权限修饰的好处一。有一天我在回过头来研究我的排序的算法,发现这个冒泡排序时间复杂度高,不是个好算法,于是我就想改成归并算法。那么此时我就可以直接在此类中就行修改,修改后在暴露给外界的Sort方法中直接调用归并方法即可,这样对于使用者来说是无感的,但是如果我把此类中private修饰符都改成了public,那么如果有使用者使用了swap()和bubble_sort()方法,当我进行算法改进的时候这些方法自然要改或删,那么使用者在使用这些方法的时候就会找不到了或者方法的逻辑变了,这样可能导致程序报错,耗费开发人员的精力。当然更改算法可以直接增加一个公共方法不就好了,保留之前的代码,大家不必细究此例,我只是借此例子做修饰符的说明,大家理解修饰符的好处即可。所以大家应该尽量把不必要暴露的成员,方法设成private。
再说default和protected修饰符,再举个例子,如果你跟另一个团队成员在共同开发一个功能包,而他要用你开发的某个方法,这时就可以用default修饰,这样对包外的类就不会开放,而跟你开发同一个功能包的人也能用。这时假设另一个在开发另一个包的人也想用你写的一个方法,那就可以用protected修饰,这样他只要继承你写的这个类就可以用到,也不会过度暴露。
借用《Java编程思想》中的一句话,权限修饰符描述的是类库创建者和该类库的外部使用者的关系,大家明白了这句话,这些权限修饰符也就很好理解了。
今天是新年第一天,也是进入2000年来第三个十年的开始,不管以前种种,希望大家可以满怀希望,信心迎接新的一年,新年快乐!
原文地址:https://www.cnblogs.com/heisenburg/p/12127752.html