Java 中的访问修饰符有四种:publicprotected默认(即不加访问修饰符)和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 特点

  1. default修饰符只能用于接口变量方法,不能用于构造函数、枚举类型或注解类型。
  2. 当一个类或接口被声明为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 修饰的类不能被其他类继承。