Java 中的访问修饰符有四种:public、protected、默认(即不加访问修饰符)和private。它们的访问权限从大到小依次是:public > protected > 默认 > private。作用是用于控制类、接口、变量和方法的可见性和访问级别。下面我们来详细介绍一下这四种访问修饰符的用法和区别。
public  | protected  | default  | private  | |
类内部  | √  | √  | √  | √  | 
本包  | √  | √  | √  | ×  | 
子类  | √  | √  | ×  | ×  | 
外部包  | √  | ×  | ×  | ×  | 
1、public 修饰符
具有最大的访问权限,可以访问任何一个在CLASSPATH下的类、接口、异常等。他往往用于对外的情况,也就是对象或类对外的一种接口的形式。
public 表示公共的,可以被任何地方的类访问。当一个类中的成员变量或方法被声明为 public 时,其他的类可以访问并调用这些成员变量和方法。
1.1 用例
public class Person {
    // 公共的成员变量
    public String name;
    // 公共的方法
    public void sayHello() {
        System.out.println("Hello, world!");
    }
}在上面的代码中,Person 类中的成员变量 name 和方法 sayHello() 都被设置为 public,其他类可以通过对象访问和调用这些成员变量和方法。
public class Test {
    public static void main(String[] args) {
        Person p = new Person();
        p.name = "琳琳";
        p.sayHello();  // 输出:Hello, world!
    }
}1.2 特点
public修饰的成员变量和方法不受访问限制,可以被其他类随意访问和调用。public修饰的类只能有一个,并且类名必须与文件名相同。
2、protected 修饰符
主要的作用就是用来保护子类的。它的含义在于子类可以用它修饰的成员,其他的不可以,相当于传递给子类的一种继承的东西。
protected 表示受保护的,可以被当前类、当前包以及其他包中的子类访问。当一个类中的成员变量或方法被声明为 protected 时,其他的类可以继承并访问这些成员变量和方法。
2.1 用例
public class Animal {
    // 受保护的成员变量
    protected String name;
    // 受保护的方法
    protected void move() {
        System.out.println("正在移动");
    }
}
public class Dog extends Animal {
    public void bark() {
        System.out.println("狗正在叫");
    }
    
    public void run() {
        // 子类可以继承和使用父类中的受保护方法和成员变量
        name = "小狗";
        move();
        System.out.println("狗正在跑");
    }
}
在上面的代码中,Animal 类中的成员变量 name 和方法 move() 都被设置为 protected,子类 Dog 可以继承并访问这些成员变量和方法。
public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.run();  // 输出:正在移动,狗正在跑
    }
}2.2 特点
protected修饰的成员变量和方法可以被当前类、当前包以及其他包中的子类访问和调用;其他包中的非子类不可见,其他包中的非子类无法访问和调用。protected修饰的类不能被其他包中的非子类继承。
3、默认(即不加访问修饰符)
当一个类、接口、变量或方法没有使用任何访问修饰符时,默认的访问级别是default。使用default修饰符声明的类、接口、变量和方法只能在同一个包中访问,不能在其他包中访问。
3.1 用例
package com.example;
class MyClass {
    int num = 10;
    void display() {
        System.out.println("num = " + num);
    }
}在这个示例中,MyClass类没有使用任何访问修饰符,因此它的访问级别是default。这意味着MyClass类只能在com.example包中访问,不能在其他包中访问。
3.2 特点
default修饰符只能用于类、接口、变量和方法,不能用于构造函数、枚举类型或注解类型。- 当一个类或接口被声明为
default时,它只能在同一个包中访问。如果想在其他包中访问该类或接口,需要使用public修饰符。 
4、private 修饰符
访问权限仅限于类的内部,是一种封装的体现,例如大多数的成员变量都是修饰符为private 的,它们不希望被其他任何外部的类访问。
private 表示私有的,只能在当前类中访问。当一个类中的成员变量或方法被声明为 private 时,其他的类无法访问和调用这些成员变量和方法。
4.1 用例
public class Person {
    // 私有的成员变量
    private String name;
    // 私有的方法
    private void sayHello() {
        System.out.println("Hello, world!");
    }
}在上面的代码中,Person 类中的成员变量 name 和方法 sayHello() 都被设置为 private,其他类无法直接访问和调用。
public class Test {
    public static void main(String[] args) {
        Person p = new Person();
        p.name = "Tom";  // 编译错误
        p.sayHello();  // 编译错误
    }
}4.2 特点
private修饰的成员变量和方法只能在当前类中访问和调用。private修饰的类不能被其他类继承。










