【Java】权限修饰符

一、引入

权限修饰符 :就是用来控制一个成员能够被访问的范围的。

它可以用来修饰:变量、方法、构造方法、内部类

例如之前写过的JavaBean:Student类,在 Student类 中可以写两个成员变量 name、age。而这两个成员变量前面写的 private 就是 权限修饰符 中的一种,它表示 私有


二、权限修饰符 的分类

在Java中,一共有四种 权限修饰符,它的作用范围从小到大依次是:private < 空着不写 < protected < public

其中,空着不写 我们也会把它叫做 缺省 / 默认

修饰符同一类中同一个包中的其他类不同包下的子类不同包下的无关类
public
空着不写(默认)
protected
private

1、private 就可以理解成爸爸的私房钱,私房钱只能自己用,而别人用不了,这就是 私有 的含义。

2、默认权限修饰符 只能在本包中使用,在其他的包中就用不了了。

这里的包你可以把它理解成 家庭,我们毕业之后,每个人的工资,是默认上交给媳妇的,也就表示,只要是在自己家里的人都可以使用你的工资。那如果外面还有一个儿子,默认情况下肯定用不了。

image-20240417155040561

3、protected ,翻译过来就是:受保护的,它是在默认的基础上,又加了一个范围,那就是:其他包中的子类也能用。

其实用刚刚的知识也能理解:外面的儿子,也是受法律保护的(受保护)。因此,除了家里人能用,外面的人也能用。

PS:但实例对象是不能够访问的。

image-20240417155310177

4、public 就很好理解了,公共的就表示所有的地方都可以使用。


三、代码实现

一共写了四个类,结构如下图

image-20240421204422716

① 同一个类中 —— 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()

image-20240519151229763

如下图,就算 Dog类继承了Animal类,在用 Dog类 的对象去调用 name 时,依旧会报错。

image-20240421205920590

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

直接点进 add() 方法进行跟踪

image-20240417160537858

add(E e) 中又调用了一个 grow() 方法,这个 grow() 方法其实就是对 ArrayList 集合进行扩容的代码。

image-20240417160708291

还有另一个 add() 方法,这个 add() 方法可以添加在指定的位置:把元素 element 添加在指定的索引 index,在这个方法中也有扩容的方法。

image-20240417161218759

在后面,我们还会学习往集合里面一次性添加多个元素的方法:addAll(),看 678行,这里也有扩容的代码。

image-20240417161517691

因此 grow() 方法(扩容)属于多个方法共性的内容,它这个扩容的方法表示的是一种规则,它不想让外界调用,因此这里的 grow() 方法就定义成了 private 私有。

image-20240417160751263
  • 30
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值