【面试干货】Static关键字的用法详解
在Java编程语言中,static是一个关键字,它可以用于多种上下文,包括类、方法、变量和代码块。static的主要作用在于它修饰的内容是与类相关联的,而不是与类的某个特定实例(对象)相关联的。
1、Static修饰内部类
使用static修饰的内部类称为静态内部类。
静态内部类不需要外部类的实例即可创建,因此它不能访问外部类的非静态成员(变量和方法)。
public class OuterClass {
private static String outerStaticField = "Outer static field";
static class StaticNestedClass {
// 静态内部类中可以访问外部类的静态成员
public void printOuterStaticField() {
System.out.println(outerStaticField);
}
}
}
2、Static修饰方法
静态方法属于类本身,而不是类的实例。
因此,它们不能访问非静态的成员(因为它们需要一个类的实例来访问),而且它们可以通过类名直接调用。
public class MyClass {
public static void staticMethod() {
System.out.println("This is a static method");
}
// 主方法可以直接调用静态方法
public static void main(String[] args) {
MyClass.staticMethod(); // 无需创建MyClass的实例
}
}
3、Static修饰变量
静态变量(也称为类变量)属于类,而不是类的实例。
这意味着它们被所有类的实例共享,并且只存在一份拷贝。静态变量在类被加载到JVM时分配内存,并且只分配一次。
public class MyClass {
public static int staticVar = 42;
// 可以通过类名直接访问静态变量
public static void main(String[] args) {
System.out.println(MyClass.staticVar); // 输出42
}
}
4、Static修饰代码块
静态代码块在类被加载到JVM时执行,并且只执行一次。
它们通常用于初始化静态变量或执行只需要执行一次的代码。
public class MyClass {
static {
System.out.println("Static block executed");
}
// 主方法会触发类的加载,因此静态代码块会被执行
public static void main(String[] args) {
// 当MyClass被加载时,静态代码块已经被执行
}
}
5、总结
1、静态方法不能直接访问非静态成员(变量和方法),因为它们属于类的实例,而静态方法属于类本身。
2、在静态方法中,this和super关键字都是无效的,因为this引用当前对象,而静态方法不依赖于任何对象。
3、静态变量在内存中只有一份拷贝,并且它们的生命周期与类相同。
4、静态代码块按照它们在类中的出现顺序依次执行,并且只执行一次。