目录
一. 访问修饰符
1. public(公共的)
使用范围:任何类
类层面:
一个public
类可以被任何其他类访问,这使得它成为构建大型应用程序接口的关键部分。例如,在一个 Java 库中,public
类是提供给外部使用者的主要入口。像 Java 标准库java.util.ArrayList
类就是public
的,这样就可以导入这个类然后创建ArrayList
对象来存储数据。
方法和变量层面:
对于public
方法,它们构成了类的对外接口。可以被任何其他类调用,这使得其他类能够方便地获取文件相关的信息。
对于public
变量,虽然可以被外部访问,但过度使用会破坏封装性。所以一般建议通过public
方法来访问和修改变量。
2. private(私有的)
使用范围:本身
成员变量:
私有变量用于隐藏类的内部状态。以银行账户类BankAccount
为例,private double balance;
用于存储账户余额。这样做是为了防止外部类直接修改余额,确保余额的修改只能通过银行账户类内部定义的合法方法,如deposit
(存款)和withdraw
(取款)方法来进行。
成员方法:
私有方法通常用于封装一些内部的操作逻辑,当一个方法是内部实现细节,外部类不需要也不应该调用它,所以将其声明为private
,以保持类的封装性。
3. protected(受保护的)
使用范围:本身和子类
继承关系中的访问:
假设我们有一个基类Vehicle
,其中有一个protected
方法protected void startEngine()
。如果有一个子类Car
继承自Vehicle
,那么Car
类可以访问startEngine
方法,即使Car
类在不同的包中。这允许子类在继承的基础上扩展或修改基类的行为。例如,Car
类可以在startEngine
方法的基础上添加一些特定于汽车的启动操作,如检查油量、启动空调等。
同包中的访问:
在同一个包中,protected
成员的访问规则和默认(包访问权限)
4. 默认(也称为包访问权限,没有修饰符)
使用范围:当前包下
包内协作:
在一个包内,没有修饰符的类、方法和变量可以方便地相互访问。在同一个包中的其他类可以直接调用方法,这有助于在包内部实现代码的共享和协作,同时限制了外部包对这些内部实现细节的访问。
包外限制:
从包外的角度看,默认访问权限的成员是不可见的。这可以看作是一种简单的封装形式,将包内部的实现细节隐藏起来,防止外部的非法访问和滥用。例如,一个外部包中的类不能直接访问com.example.utils
包中StringUtils
类的默认方法isEmpty
,这有助于维护代码的安全性和模块性。
二. 非访问修饰符
1. static(静态的)
修饰变量和方法
变量方面:
被声明为static
的变量属于类,而不是属于类的某个对象。它在类加载时就被初始化,只有一份内存空间,所有该类的对象共享这个静态变量。
方法方面:
static
方法属于类,不需要创建类的对象就可以调用。它不能直接访问非静态的成员(变量和方法),因为非静态成员是和对象相关的。
2. final(最终的)
修饰变量和方法
对于变量:
如果一个变量被声明为final
,那么它的值一旦被初始化就不能再改变。如果是基本数据类型,变量的值不能改变;如果是引用数据类型,引用不能改变(但是对象的内容可以改变)。
方法方面:
final
方法不能被子类重写。这可以保证方法的行为在继承体系中保持一致。
3. abstract(抽象的)
修饰类和方法
对于类:
abstract
类是不能被实例化的,它主要用于作为其他类的基类(父类),通常包含一个或多个抽象方法。
对于方法:
抽象方法没有方法体,只有方法签名。它必须在抽象类中,并且要求非抽象的子类必须实现(重写)这个抽象方法。
4. synchronized(同步的)
修饰方法和代码块
主要用于多线程编程。当一个方法或代码块被synchronized
修饰时,同一时刻只能有一个线程访问这个方法或代码块,保证了数据的一致性和线程安全。
5. volatile(易变的)
用于多线程编程,主要是保证变量的可见性。当一个变量被声明为volatile
时,一个线程对这个变量的修改会立即被其他线程看到。