static
关键字
static
关键字用于声明类的成员(方法或变量)为静态成员。静态成员属于类本身,而不是类的实例。换句话说,静态成员可以通过类名直接访问,而不需要实例化对象。
- 静态变量:属于类的所有对象共享,类的所有实例共享相同的内存位置。
- 静态方法:可以在没有创建对象的情况下直接调用。
- 静态块:在类加载时执行一次,用于初始化类的静态成员。
- 编译时机:
static
关键字主要在编译时确定。它告诉 JVM,该成员属于类而非实例,因此不需要通过对象来访问。static
修饰的变量和方法会被加载到 方法区 中的 类的结构部分。 - 内存存储位置:
static
成员存储在 方法区 中的 类的静态变量区。每个类只有一个静态变量区,所有实例共享这部分内存。静态方法也存储在方法区的 方法区(Method Area) 中。
count
是静态变量,在两个 Counter
对象中共享,displayCount
是静态方法,可以通过类名直接调用。
class Counter {
static int count = 0; // 静态变量
Counter() {
count++; // 每次创建对象时,静态变量 count 会增加
}
static void displayCount() {
System.out.println("Count: " + count); // 静态方法可以直接访问静态变量
}
}
public class Main {
public static void main(String[] args) {
Counter c1 = new Counter();
Counter c2 = new Counter();
Counter.displayCount(); // 调用静态方法,输出 Count: 2
}
}
final
关键字
final
是一个多用途的关键字,它可以用于变量、方法和类的定义,分别具有不同的含义。
- 用于变量:声明为
final
的变量是常量,一旦赋值后不可更改(不可重新赋值)。 - 用于方法:声明为
final
的方法不能被子类重写。 - 用于类:声明为
final
的类不能被继承。 - 编译时机:
final
关键字的使用在编译时就确定了变量、方法或类的行为。例如,如果一个方法被声明为final
,编译器会禁止任何子类重写该方法;如果一个类被声明为final
,编译器会禁止任何子类继承该类。对于变量,final
确保该变量一旦赋值后不可修改。 - 内存存储位置:
- final 变量:常量(
final
变量)通常在 方法区 中的 常量池(Constant Pool) 中存储。如果是局部变量,存储在栈中。 - final 类和方法:存储在 方法区 中的 类的结构部分。
final
类和方法不会被继承或重写,因此它们在运行时不需要动态解析。
- final 变量:常量(