【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
### Java 权限修饰符概述 Java 中有四种权限修饰符,分别为 `public`、`private`、`protected` 和默认修饰符(也称为包级私有)。每种修饰符决定了类、方法、变量以及构造器的可见性和访问范围。 #### 1. **Private 修饰符** `private` 是最严格的访问修饰符。使用此修饰符的成员只能在其所属的类内部被访问。即使是在子类中也无法直接访问这些成员。 示例代码如下: ```java class Example { private int secretNumber; public void setSecret(int number) { this.secretNumber = number; } private void showSecret() { System.out.println("The secret is: " + secretNumber); } } ``` 上述代码展示了如何通过 `setSecret()` 方法间接设置 `secretNumber` 值[^1]。 --- #### 2. **Default(默认)修饰符** 当未显式指定任何访问修饰符时,默认修饰符生效。具有默认访问级别的成员仅能被与其位于相同包内的其他类所访问。 示例代码如下: ```java // File: SamePackageClass.java package same.package.name; class DefaultAccessExample { String message = "This can only be accessed within the same package."; } // Another class in the same package can access 'message' class AccessorInSamePackage { public static void main(String[] args) { DefaultAccessExample example = new DefaultAccessExample(); System.out.println(example.message); // Valid because it's in the same package. } } ``` --- #### 3. **Protected 修饰符** `protected` 成员不仅可以被其所在的类及其子类访问,还能被同一包下的其他类访问。然而,不同包中的非子类无法访问此类成员。 示例代码如下: ```java class Parent { protected String familyName = "Smith"; } class Child extends Parent { public void displayFamilyName() { System.out.println(familyName); // Valid as Child inherits from Parent. } } // A different package and non-subclass cannot directly use 'familyName'. ``` --- #### 4. **Public 修饰符** `public` 是最为宽松的访问修饰符。标记为 `public` 的成员可以在任何地方被任意类访问。这是实现完全公开接口的主要方式之一。 示例代码如下: ```java public class PublicExample { public String greeting = "Hello, world!"; public void sayGreeting() { System.out.println(greeting); } } class AnyOtherClass { public static void main(String[] args) { PublicExample example = new PublicExample(); example.sayGreeting(); // Fully accessible due to being declared as 'public'. } } ``` --- ### 总结表:各修饰符的可见性对比 | 修饰符 | 本类 | 同一包 | 不同包的子类 | 不同包的非子类 | |-------------|------------|------------|----------------------|----------------| | `private` | ✔ | ✘ | ✘ | ✘ | | 默认(无) | ✔ | ✔ | ✘ | ✘ | | `protected` | ✔ | ✔ | ✔ | ✘ | | `public` | ✔ | ✔ | ✔ | ✔ | 上表清晰地描述了各种修饰符在不同场景下的适用情况[^4]。 --- ### 结论 合理运用不同的访问修饰符可以帮助开发者更好地控制程序组件之间的交互关系,从而提升软件的设计质量与安全性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值