**
Java 语言中的访问权限修饰符有 4 种,但却只有 3 个关键字。因为不写访问权限修饰符时,在 Java 中被称为默认权限(包权限),本课程中以 default 代替。其他 3 个访问权限修饰符分别为 private、protected 和 public。
那这些访问修饰符都可以用在什么地方呢?🤔️
在定义类、属性、方法时都需要指定访问修饰符,以此来限定类、属性、方法的可访问范围,是不是感觉访问修饰符很强大。是的,它就是这么强大。接下来我们一个个的来分析一下这些访问修饰符,请大家往下看 👇。
-
private:私有的private 可以修饰属性、方法。被 private 修饰的类成员只能在定义它们的类中使用,在其他类中都不能访问。
还记得我们前面介绍封装的时候,已经使用了 private 这个访问权限修饰符。对于封装良好的程序而言,一般将属性私有化,提供公有的 getter 和 setter 方法,供其他类调用。
-
default:默认权限 ,不使用修饰符不写任何权限关键字就代表使用默认权限,属性、构造方法、普通方法都能使用默认权限。默认权限也称为同包权限。同包权限的元素只能在定义它们的类中以及同包的类中被调用。
-
protected:受保护的protected 可以修饰属性、方法,能在定义它们的类中以及同包的类中调用被 protected 修饰的成员。如果有不同包中的类想调用它们,那么这个类必须是这些成员所属类的子类。关于子类及相关概念,将会在后续讲解继承的时候详细介绍。
-
public:公共的public 可以修饰属性、方法和类。被 public 修饰的成员,可以在任何一个类中被调用,是权限最大的访问权限修饰符。
访问权限修饰符使用范围总结如下表所示 👇:
| 修饰符 | 类内部 | 同一个包中 | 子类 | 任何地方 |
|---|---|---|---|---|
| private | Yes | |||
| default | Yes | Yes | ||
| protected | Yes | Yes | Yes | |
| public | Yes | Yes | Yes | Yes |
说明:访问修饰符在遇到反射的时候,访问权限会被突破,即在特定情况下会失效。
对于类而言,能使用的访问权限修饰符只有 public 和 default(也有特例,如以后会学到的内部类,这里不展开)。如果使用 public 修饰某个类,则表示该类在任何地方都能被访问,如果不写访问权限修饰符,则该类只能在本包中使用。
说了这么多,我们还是给大家上案例吧 😊。
在两个不同的包下分别创建两个类:
- 首先需要在
/home/project目录下依次建立org、lanqiao和entity子目录,然后在project目录下的org/lanqiao/entity子目录下创建Student.java文件,如下图所示 👇。
Student 类的代码如下 👇:
package org.lanqiao.entity; // 声明包
/**
* 学生类
* @author lanqiao
*/
public class Student {
public void show() {
System.out.println("我是一名三好学生!!!");
}
}
- 需要在
/home/project目录下依次建立org、lanqiao和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();
}
}
- 编译运行,结果如下图所示:
javac org/lanqiao/test/TestStudent.java
java org.lanqiao.test.TestStudent
结果如下图所示:
编译的时候需要进入到包下执行编译,运行的时候需要指定包下的某个类,具体命令如上所示。
上面这些程序可以正常编译执行。如果将 Student.java 文件中定义类的语句 public class Student 中的 public 去掉,使该类的访问权限变为只能在本包中使用,在编译 TestStudent.java 时,编译器会报出如图所示的错误。
前面已经给大家介绍了 default ,它是默认访问权限(书写代码时可以不用写),下面以普通方法为例介绍同包权限,代码仍然编写在 /home/project 目录下。
- 修改
/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);
}
}
- 在下面的测试类中调用
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();
}
}
- 编译此程序时,会报错,结果如下图。
- 在
void showName()方法前添加public关键字,编译并运行程序,可正常运行。
这里给大家演示了 public 和 default (默认权限),还有 protected 和 private 大家可以自己动手去尝试一下,看看结果哦 😊。