八、Java中的访问权限修饰符
模拟两个小场景:
场景一:学生 A 创建了一个类 StudentA,但是学生 A 并不希望 StudentA 被其他类都访问到,该如何处理呢?
场景二:学生 A 创建了一个类 StudentA,其中有两个方法 fun1、fun2,学生 A 只想让 fun1 对外可见,也就是说,如果别的学生来调用 StudentA,只可以调用方法 fun1,该怎么处理呢?
显然,这就要使用到访问权限修饰符了。
在 Java 中,提供了四种访问权限修饰符:
- 默认访问权限(包访问权限);
- public
- private
- protected
8.1 修饰类
类只可以用默认访问权限
和 public
修饰:
// public修饰
public class Student{}
// 默认访问权限
class Student{}
-
默认访问权限(包访问权限):用来修饰类的话,表示该类只对同一个包中的其他类可见。
例一:两个类在同一个包下
Student.java
package com.qhj.obj; /** * @author QHJ * @date 2022/8/30 09:23 * @description: 类访问权限(默认访问权限) */ class Student { private String name; public Student(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Main.java
package com.qhj.obj; /** * @author QHJ * @date 2022/8/30 09:24 * @description: 访问同包下的类 */ public class Main { public static void main(String[] args) { Student student = new Student("青花椒"); System.out.println(student.getName()); } }
由此可见,修饰 Student 类采用的是默认访问权限,且 Student 类和 Main 类在同一个包中,所以 Student 类对 Main 类是可见的。
例二:两个类不在同一个包下
package com.qhj.test1; /** * @author QHJ * @date 2022/8/30 09:43 * @description: */ class Student { private String name; public Student(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
提示 Student 类在 Main 类中不可见。这就可以看出,如果用默认访问权限去修饰一个类时,该类只对同一个包中的其他类可见,对于其他包中的类是不可见的。 -
public:用来修饰类的话,表示该类对其他所有的类都可见。
如果把 Student 类的默认访问权限更改为 public 的话,Student 类对于 Main 类就可见了。
8.2 修饰类的方法和变量
- 默认访问权限(包访问权限):如果一个类的方法或变量被包访问权限修饰,也就意味着只能在同一个包中的其他类中显式地调用该类的方法或者变量,在不同包中的类中不能显式地调用该类的方法或变量。
- private:如果一个类的方法或者变量被 private 修饰,那么这个类的方法或者变量只能在该类本身中呗访问,在类外以及其他类中都不能显式的进行访问。
- protected:如果一个类的方法或者变量被 protected 修饰,对于同一个包的类,这个类的方法或者变量是可以被访问的。对于不同包的类,只有继承于该类的类才可以访问到该类的方法或者变量。
- public:被 public 修饰的方法或者变量,在任何地方都是可见的。
8.3 补充
- Java 中的包主要是为了防止类文件命名冲突以及方便进行代码组织和管理;
- 对于一个 Java 源代码文件,如果存在 public 类的话,只能有一个 public 类,且此时源代码文件的名称必须和 public 类的名称完全相同;
- 如果还存在其他类,这些类在包外是不可见的。如果源代码文件没有 public 类,则源代码文件的名称可以随意命名。