文章目录
一、引入
权限修饰符
:就是用来控制一个成员能够被访问的范围的。
它可以用来修饰:变量、方法、构造方法、内部类
。
例如之前写过的JavaBean:Student类
,在 Student类
中可以写两个成员变量 name、age
。而这两个成员变量前面写的 private
就是 权限修饰符
中的一种,它表示 私有
。
二、权限修饰符
的分类
在Java中,一共有四种 权限修饰符
,它的作用范围从小到大依次是:private < 空着不写 < protected < public
其中,空着不写
我们也会把它叫做 缺省 / 默认
修饰符 | 同一类中 | 同一个包中的其他类 | 不同包下的子类 | 不同包下的无关类 |
---|---|---|---|---|
public | √ | |||
空着不写(默认) | √ | √ | ||
protected | √ | √ | √ | |
private | √ | √ | √ | √ |
1、private
就可以理解成爸爸的私房钱,私房钱只能自己用,而别人用不了,这就是 私有
的含义。
2、默认权限修饰符
只能在本包中使用,在其他的包中就用不了了。
这里的包你可以把它理解成 家庭
,我们毕业之后,每个人的工资,是默认上交给媳妇的,也就表示,只要是在自己家里的人都可以使用你的工资。那如果外面还有一个儿子,默认情况下肯定用不了。
3、protected
,翻译过来就是:受保护的
,它是在默认的基础上,又加了一个范围,那就是:其他包中的子类也能用。
其实用刚刚的知识也能理解:外面的儿子,也是受法律保护的(受保护)。因此,除了家里人能用,外面的人也能用。
PS:但实例对象是不能够访问的。
4、public
就很好理解了,公共的就表示所有的地方都可以使用。
三、代码实现
一共写了四个类,结构如下图
![image-20240421204422716](https://img-blog.csdnimg.cn/img_convert/3f8b736bead1e80045b7f0c3e85d35b2.png)
① 同一个类中 —— demo1.Animal
public class Animal {
public String name;
public void show(){
System.out.println(name);
}
}
② 同一个包中的其他类 —— demo1.Test
public class Test {
public static void main(String[] args) {
Animal a = new Animal();
System.out.println(a.name);
}
}
③ 不同包下的子类 —— demo2.Dog
PS:但实例对象是不能够访问的,即:它无论是对 Animal
的实例对象,还是对 Dog
的实例对象都是不可见的!
如下图,创建 Animal
的实例对象,依旧访问不到 show()
如下图,就算 Dog类继承了Animal类
,在用 Dog类
的对象去调用 name
时,依旧会报错。
public class Dog extends Animal {
public void show() {
System.out.println(name);
}
}
④ 不同包下的无关类 —— demo2.Test
public class Test {
public static void main(String[] args) {
Animal a = new Animal();
System.out.println(a.name);
}
}
四、权限修饰符的使用规则
在实际开发中,一般只用 private
(最小的) 和 public
(最大的) 。默认
、protected
一般用的很少,因此我们只需要记住 最大和最小
的就行了。
在使用的时候一般会遵守以下规则:
-
所有的成员变量都要私有
-
方法需要使用
public
进行公开特例:如果方法中的代码是抽取其他方法中共性代码,这个方法一般是不对外提供的,也需要使用
private
进行私有。
代码示例
ctrl + N 搜索一下 ArrayList
的源代码。
然后 ctrl + F12 搜索一下 add(E e)
方法。
![image-20240417160346463](https://img-blog.csdnimg.cn/img_convert/6868aecb05fab451c43c5b33be3719aa.png)
直接点进 add()
方法进行跟踪
![image-20240417160537858](https://img-blog.csdnimg.cn/img_convert/6837a6a1b8ad8e4bb10e59416df909ee.png)
在 add(E e)
中又调用了一个 grow()
方法,这个 grow()
方法其实就是对 ArrayList
集合进行扩容的代码。
![image-20240417160708291](https://img-blog.csdnimg.cn/img_convert/5a43573f0f97cf58e174a95deaa31d2d.png)
还有另一个 add()
方法,这个 add()
方法可以添加在指定的位置:把元素 element
添加在指定的索引 index
,在这个方法中也有扩容的方法。
在后面,我们还会学习往集合里面一次性添加多个元素的方法:addAll()
,看 678行
,这里也有扩容的代码。
因此 grow()
方法(扩容)属于多个方法共性的内容,它这个扩容的方法表示的是一种规则,它不想让外界调用,因此这里的 grow()
方法就定义成了 private
私有。
![image-20240417160751263](https://img-blog.csdnimg.cn/img_convert/c90fcbfb162369941ee33375ecec1320.png)