1. 静态变量和静态方法在内存中的分配机制
- 静态变量:
- 静态变量在类加载时被分配内存,存储在方法区(在Java 8及以后,方法区被元空间替代)。无论创建多少个类的实例,静态变量只有一份副本。例如:
public class StaticVariableExample {
static int staticVar;
public static void main(String[] args) {
StaticVariableExample instance1 = new StaticVariableExample();
StaticVariableExample instance2 = new StaticVariableExample();
instance1.staticVar = 10;
System.out.println(instance2.staticVar); // 输出10,因为静态变量只有一份
}
}
- 静态方法:
- 静态方法同样在类加载时被加载到方法区。它不依赖于类的实例,直接与类相关联。静态方法内部只能访问静态变量和其他静态方法,因为在静态方法调用时可能还没有创建类的实例。例如:
public class StaticMethodExample {
static int staticVar = 10;
static void staticMethod() {
System.out.println(staticVar);
}
public static void main(String[] args) {
StaticMethodExample.staticMethod(); // 输出10
}
}
2. 不同场景下调用静态变量和静态方法
- 类内调用:
- 在类内部,静态变量和静态方法可以直接调用,无需使用类名。例如:
public class InnerCallExample {
static int staticVar = 20;
static void staticMethod() {
System.out.println(staticVar); // 直接调用静态变量
anotherStaticMethod(); // 直接调用静态方法
}
static void anotherStaticMethod() {
System.out.println("Another static method");
}
public static void main(String[] args) {
InnerCallExample.staticMethod();
}
}
- 类外调用:
- 从类外部调用静态变量和静态方法,使用“类名.静态成员”的方式。例如:
public class OuterCallExample {
static int staticVar = 30;
static void staticMethod() {
System.out.println("Static method");
}
}
class Main {
public static void main(String[] args) {
System.out.println(OuterCallExample.staticVar); // 调用静态变量
OuterCallExample.staticMethod(); // 调用静态方法
}
}
- 继承体系中调用:
- 在继承体系中,子类可以通过子类名或父类名调用从父类继承的静态变量和静态方法。静态成员属于类,而不属于实例,所以继承关系对静态成员的调用主要基于类名。例如:
class Parent {
static int staticVar = 40;
static void staticMethod() {
System.out.println("Parent static method");
}
}
class Child extends Parent {
// 子类可以继承父类的静态成员
}
class InheritanceCallExample {
public static void main(String[] args) {
System.out.println(Child.staticVar); // 通过子类名调用父类静态变量
Child.staticMethod(); // 通过子类名调用父类静态方法
System.out.println(Parent.staticVar); // 也可以通过父类名调用
Parent.staticMethod();
}
}