static 关键字
Java 中 static 关键字主要用于内存管理。Java 中 static 关键字可用于修饰 变量、方法、代码块、嵌套类。static 关键字修饰的对象属于类,而不是类的实例。
static 可以是:
- 变量(类变量或静态变量)
- 方法(类方法或静态方法)
- 代码块(静态代码块)
- 嵌套类(静态内部类)
类变量 - 静态变量
用 static 修饰的变量称为静态变量(类变量)。
静态变量的优点:
- 静态变量使程序存储器更高效(节省内存)
注:
静态变量属于类,不属于类的实例,所有类的实例共享静态变量,所以不会在每个类的实例创建多个副本,这就是节省内存的原因。因为静态变量是类的实例共享的,这也是它的缺点,有可能造成线程不安全的。
静态方法 - 类方法
用 static 修饰的方法称为静态方法(类方法)。
- 静态方法属于类,不属于类的实例。
- 静态方法可以用类直接调用,无需创建类的实例,当然也可以用类的实例调用。
- 静态方法可以访问静态变量、静态方法,但不能直接访问非静态变量和非静态方法。
静态方法限制: - 静态方法不能直接使用非静态变量或调用非静态方法。
- this 和 super 两个关键字不能在静态上下文中使用。
为什么 Java main 方法是静态的 ?
@TODO
静态代码块
Java 中静态代码块主要有两个作用:
- 用于初始化静态变量
- 在类加载是在 main 方法之前执行
注:
静态代码快在main方法和构造方法之前初始化。
静态内部类
静态内部类是指使用 static 修饰的内部类。例如:
public class OuterClass {
static class InnerClass {
// ...
}
}
- 创建静态内部类的实例时,不需要创建外部类的实例。
- 静态内部类中可以定义静态成员和实例成员。
- 静态内部类可以直接访问外部类的静态成员,若要访问外部类的实例成员,则需要通过外部类的实例访问。
- 其它类可以创建静态内部类,但需要加上外部类名作为前缀,且静态内部类受外部类的权限修饰符(public, protected, private, default) 的限制。