HOWTO · Java

Java 中的静态是什么意思

本文介绍 Java 中的 static 关键字。

本页内容

在 Java 语言中,static 是一个可以在不同地方使用的关键字。static 关键字与成员变量、成员函数、块和嵌套类一起使用。静态关键字的应用是我们不想每次都创建新实例的地方。相反,我们在类内共享单个副本的地方使用它。静态变量存储在堆内存中,这是一种永久内存。

在 Java 中使用 static 关键字和成员变量

代码块解释了静态变量与非静态变量的不同之处。

public class StaticVariableUsage {
  public static void main(String[] args) {
    InnerClass in = new InnerClass();
    InnerClass in1 = new InnerClass();

    InnerClass2 in2 = new InnerClass2();
    InnerClass2 in3 = new InnerClass2();
  }

  static class InnerClass {
    static int var4 = 0;
    InnerClass() {
      var4++;
      System.out.println("static variable : " + var4);
    }
  }

  static class InnerClass2 {
    int var5 = 0;
    InnerClass2() {
      var5++;
      System.out.println("non-static variable : " + var5);
    }
  }
}

在上面的代码块中,有一个名为 StaticVariableUsage 类的公共类。它有一个静态方法和两个内部类。名为 InnerClass 的内部类有一个静态整数变量 var4 并从零开始。该类有一个构造函数,用于递增静态整数变量并打印其值。

另一个内部类名为 InnerClass2,并保存一个非静态变量 var5。这个类也有一个构造函数,它增加非静态变量并打印它的值。

移动到 main 方法,这里,InnerClassInnerClass2 被实例化了两次。当构造函数调用发生时,可以推导出使用 new 关键字实例化对象的分析。

正如输出所说,静态变量被启动并被保留。该值第一次增加并将值打印为 1。下一次,当我们创建另一个实例时,构造函数会再次被调用。但是静态变量不会再次用零重新初始化。相反,先前存储的值会增加,因此,使静态变量值变为 2。

类似地,当创建 InnerClass2 的实例时,每次非静态变量都会被初始化为值 0。因此,它在两次输出中都将 value 打印为 1

static variable : 1
static variable : 2
non-static variable : 1
non-static variable : 1

在 Java 中使用 static 关键字和成员函数

我们有一个名为 StaticFunctionUsage 的外部类,它包含下面类中的另一个内部类。InnerClass 有一个静态函数。另一个名为 InnerClass1 的内部类有一个非静态方法。

现在,转到 main 方法,可以看到可以使用类名直接访问静态函数。我们不必实例化 InnerClass 对象。类似地,当我们尝试使用类名访问非静态函数 function1 时,会填充编译时错误。如果我们想访问该函数,则需要创建类实例,我们使用名称 in 变量创建了该实例。变量的用途是调用 function1,是一个有效的语句。

public class StaticFunctionUsage {
  public static void main(String[] args) {
    InnerClass.function();
    // InnerClass1.function1();
    InnerClass1 in = new InnerClass1();
    in.function1();
  }

  static class InnerClass {
    static void function() {
      System.out.println("In the static function");
    }
  }

  static class InnerClass1 {
    void function1() {
      System.out.println("In the non-static function");
    }
  }
}

上述代码块的输出如下。

In the static function
In the non-static function

在 Java 块中使用 static 关键字

静态块的用途是初始化静态变量。程序的执行从 main 方法开始。如果类中存在静态块,则它会在 main 方法执行之前执行。

下面是解释静态块的代码。

public class StaticBlock {
  static {
    System.out.println("In the static block");
  }

  public static void main(String[] args) {
    System.out.println("In the main method");
  }
}

代码的输出如下。正如我们所见,静态块中的语句首先被执行。

In the static block
In the main method