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
修饰的类不能被其他类继承。