在 Java 中,静态变量和静态方法是与类本身关联的,而不是与类的实例(对象)关联。它们在内存中只存在一份,可以被类的实例共享

静态变量(也称为类变量)

是在类中使用 static 关键字声明的变量。它们属于类而不是任何具体的对象。主要的特点:

  • 共享性:所有该类的实例共享同一个静态变量。如果一个实例修改了静态变量的值,其他实例也会看到这个更改。
  • 初始化:静态变量在类被加载时初始化,只会对其进行一次分配内存。
  • 访问方式:静态变量可以直接通过类名访问,也可以通过实例访问,但推荐使用类名。
    就比如:
public class MyClass {
    static int staticVar = 0; // 静态变量

    public MyClass() {
        staticVar++; // 每创建一个对象,静态变量自增
    }

    public static void printStaticVar() {
        System.out.println("Static Var: "
    }
}

// 使用示例
MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass();
MyClass.printStaticVar(); // 输出 Static Var

输出是 2,因为属于的是类不是实例

静态方法

静态方法是在类中使用 static 关键字声明的方法。类似于静态变量,静态方法也属于类,而不是任何具体的对象(没有所谓的 this)。主要的特点:

  • 无实例依赖:静态方法可以在没有创建类实例的情况下调用。对于静态方法来说,不能直接访问非静态的成员变量或方法,因为静态方法没有上下文的实例。
  • 访问静态成员:静态方法可以直接调用其他静态变量和静态方法,但不能直接访问非静态成员。
  • 不存在多态性:静态方法不支持重写(Override),但可以被隐藏(Hide)。

静态方法不存在多态,调用看引用变量的类型,不看 new 出来的实际对象类型

class Father{
    public static void test(){
        System.out.println("father static");
    }
}
class Son extends Father{
    public static void test(){
        System.out.println("son static");
    }
}
// 测试
Father f = new Son();
f.test(); // 输出 father static,看引用类型Father,不是Son,这就是方法隐藏

不看 new 的 Son,只看引用对象 Father