Java访问修饰符

286 阅读4分钟

**

Java 语言中的访问权限修饰符有 4 种,但却只有 3 个关键字。因为不写访问权限修饰符时,在 Java 中被称为默认权限(包权限),本课程中以 default 代替。其他 3 个访问权限修饰符分别为 privateprotected 和 public

那这些访问修饰符都可以用在什么地方呢?🤔️

在定义类、属性、方法时都需要指定访问修饰符,以此来限定类、属性、方法的可访问范围,是不是感觉访问修饰符很强大。是的,它就是这么强大。接下来我们一个个的来分析一下这些访问修饰符,请大家往下看 👇。

  • private:私有的

    private 可以修饰属性、方法。被 private 修饰的类成员只能在定义它们的类中使用,在其他类中都不能访问。

    还记得我们前面介绍封装的时候,已经使用了 private 这个访问权限修饰符。对于封装良好的程序而言,一般将属性私有化,提供公有的 getter 和 setter 方法,供其他类调用。

  • default:默认权限 ,不使用修饰符

    不写任何权限关键字就代表使用默认权限,属性、构造方法、普通方法都能使用默认权限。默认权限也称为同包权限。同包权限的元素只能在定义它们的类中以及同包的类中被调用。

  • protected:受保护的

    protected 可以修饰属性、方法,能在定义它们的类中以及同包的类中调用被 protected 修饰的成员。如果有不同包中的类想调用它们,那么这个类必须是这些成员所属类的子类。关于子类及相关概念,将会在后续讲解继承的时候详细介绍。

  • public:公共的

    public 可以修饰属性、方法和类。被 public 修饰的成员,可以在任何一个类中被调用,是权限最大的访问权限修饰符。

访问权限修饰符使用范围总结如下表所示 👇:

修饰符类内部同一个包中子类任何地方
privateYes
defaultYesYes
protectedYesYesYes
publicYesYesYesYes

说明:访问修饰符在遇到反射的时候,访问权限会被突破,即在特定情况下会失效。

对于类而言,能使用的访问权限修饰符只有 public 和 default(也有特例,如以后会学到的内部类,这里不展开)。如果使用 public 修饰某个类,则表示该类在任何地方都能被访问,如果不写访问权限修饰符,则该类只能在本包中使用。

说了这么多,我们还是给大家上案例吧 😊。

在两个不同的包下分别创建两个类:

  1. 首先需要在 /home/project 目录下依次建立 orglanqiao 和 entity 子目录,然后在 project 目录下的 org/lanqiao/entity 子目录下创建 Student.java 文件,如下图所示 👇。

图片描述

Student 类的代码如下 👇:

package org.lanqiao.entity; // 声明包
/**
 * 学生类
 * @author lanqiao
 */
public class Student {

    public void show() {
        System.out.println("我是一名三好学生!!!");
    }
}
  1. 需要在 /home/project 目录下依次建立 orglanqiao 和 test 子目录,然后在 org/lanqiao/test子目录下创建 TestStudent.java 文件,如下图所示 👇。

图片描述

TestStudent 类的代码如下 👇:

package org.lanqiao.test;

/**
 * 测试类
 * @author lanqiao
 */
import org.lanqiao.entity.*; // 导入 com.lanqiao.enity 中所需要使用的公共类

public class TestStudent {
    public static void main(String[] args) {
        // 直接使用导入的类
        Student ts = new Student();
        ts.show();
    }
}
  1. 编译运行,结果如下图所示:
javac org/lanqiao/test/TestStudent.java
java org.lanqiao.test.TestStudent

结果如下图所示:

图片描述

编译的时候需要进入到包下执行编译,运行的时候需要指定包下的某个类,具体命令如上所示。

上面这些程序可以正常编译执行。如果将 Student.java 文件中定义类的语句 public class Student 中的 public 去掉,使该类的访问权限变为只能在本包中使用,在编译 TestStudent.java 时,编译器会报出如图所示的错误。

图片描述

前面已经给大家介绍了 default ,它是默认访问权限(书写代码时可以不用写),下面以普通方法为例介绍同包权限,代码仍然编写在 /home/project 目录下。

  1. 修改 /home/project 目录下 org/lanqiao/entity 子目录中的 Student.java 文件,代码如下 👇。
package org.lanqiao.entity;
/**
 * 学生类
 * @author lanqiao
 */
public class Student {
    String stuName;

      /**
     * 一个参数的构造方法
     */
    public Student(String name){
        this.stuName = name;
    }

    /**
     * 访问权限为default
     */
    void showName(){
        System.out.println("学生姓名为:" + this.stuName);
    }
}
  1. 在下面的测试类中调用 Student 类的默认访问权限的 showName() 方法。
package org.lanqiao.test;

import org.lanqiao.entity.*;
/**
 * 测试类
 * @author lanqiao
 */
public class TestStudent {
    public static void main(String[] args) {
        // 使用构造方法创建学生对象
        Student xiaolan = new Student("小蓝");
        xiaolan.showName();
    }
}
  1. 编译此程序时,会报错,结果如下图。

图片描述

  1. 在 void showName() 方法前添加 public 关键字,编译并运行程序,可正常运行。

图片描述

这里给大家演示了 public 和 default (默认权限),还有 protected 和 private 大家可以自己动手去尝试一下,看看结果哦 😊。