Java修饰符是用来改变类、方法、变量、接口等元素的行为和可见性的关键字。Java修饰符主要分为两大类:访问修饰符和非访问修饰符。
访问修饰符(Access Modifiers):
-
public:
- 提供最大的访问权限,任何类(无论是同一包内的还是不同包的)都可以访问到public修饰的类、方法和变量。
示例:
public class MyClass { public int myPublicVar; public void myPublicMethod() { ... } }
-
private:
- 最严格的访问控制,仅限于所在类内部访问,对于类的外部、子类或其他包中的类都无法访问。
示例:
class MyClass { private int myPrivateVar; private void myPrivateMethod() { ... } }
-
protected:
- **允许在同一包中的任何类访问,同时允许不同包的子类访问。**这对于继承体系下的封装和访问控制非常有用。
示例:
package com.example; class ParentClass { protected int myProtectedVar; protected void myProtectedMethod() { ... } } package com.another; class ChildClass extends com.example.ParentClass { // 可以访问myProtectedVar和myProtectedMethod }
-
默认访问权限(无修饰符):
- 当不使用任何访问修饰符时,类、方法或变量具有包访问权限。也就是说,它们可以被同一包内的所有类访问,但不能被不同包的类访问,无论是否有继承关系。
非访问修饰符(Non-Access Modifiers):
非访问修饰符用于提供关于类、方法、变量等成员的其他信息。 如它们是否是静态的、最终的、抽象的等。
-
static:
- 修饰类成员(字段、方法或嵌套类),表明它是属于类本身的,而不是属于类的某个实例。无需创建对象就可以通过类名直接访问。
示例:
class MyClass { static int count; static void incrementCount() { count++; } } // 直接通过类名调用 MyClass.incrementCount();
-
final:
- 修饰类表示不能被继承;修饰方法表示不能被重写;修饰变量表示常量,一旦赋值后就不能再更改。
示例:
final class MyFinalClass { ... } // 不可继承的类 class MyClass { final void myFinalMethod() { ... } // 不可重写的方法 final int CONSTANT = 10; // 常量 }
-
abstract:
- 用于修饰类,表示该类是抽象类,不能被实例化;修饰方法表示该方法没有具体实现,由子类去实现。
示例:
abstract class AbstractClass { abstract void doSomething(); // 抽象方法 }
-
synchronized:
- 修饰方法或代码块,用于处理多线程并发访问资源时的同步控制。
示例:
class MyClass { public synchronized void syncMethod() { // 同步方法,同一时间只有一个线程可以执行 } }
-
volatile:
- 修饰变量,确保线程间的可见性和防止指令重排序。
示例:
class MyClass { volatile boolean flag; }
-
transient:
- 修饰变量,表示该变量不会被序列化机制处理,在对象被序列化时,该变量的值不保存到序列化的流中。
示例:
class MyClass implements Serializable { transient int tempData; // 不会被序列化 }
-
native:
- 修饰方法,表示该方法是由Java之外的语言(如C、C++)实现的,并通过JNI(Java Native Interface)调用。
示例:
class MyClass { native void myNativeMethod(); // 由非Java代码实现的方法 }
-
strictfp:
- 修饰类或方法,表示在这个类或方法中进行的浮点数运算遵循严格的IEEE 754标准,确保跨平台的一致性。
示例:
strictfp class MyClass { strictfp double calculate() { ... } // 浮点计算严格遵守IEEE 754标准 }
对于接口的修饰符:
- public:接口默认就是public,所以即使没有显式写出public,接口也会对所有类开放。
- abstract:接口方法默认就是抽象的,无需显式标注。
- default:Java 8开始支持的修饰符,用于在接口中提供一个默认的方法实现。
- static:Java 8开始支持的修饰符,用于在接口中定义静态方法。
- strictfp:接口也可以被strictfp修饰,使得所有实现此接口的类中的相应方法执行严格的浮点计算。