HOWTO · Java

Java 中 static 变量和 final 变量之间的区别

它显示了 Java 中静态变量和最终变量之间的区别。此外,将通过代码示例讨论这两个变量的使用。

本教程展示了 staticfinal 关键字之间的区别。让我们以表格格式和工作示例讨论差异。

static final
声明期间不需要初始化静态变量。 声明最终变量时需要对其进行初始化。
静态变量可以重新初始化 最终变量无法重新初始化。
它与嵌套的静态类、变量、方法和块一起使用。 它与类、方法和变量一起使用。
静态方法只能被其他静态方法调用。 最终方法不能被子类覆盖。

Java 中的静态变量

当我们创建一个静态变量或方法时,它是附加到类而不是对象上的。变量或方法将共享整个程序的相同引用。

下面的程序有一个类 DummyClass,其中包含一个静态变量 num 和一个名为 dummyMethod()static 方法。要从另一个类访问这两个成员,我们不能创建 DummyClass 的对象,因为它们是静态的。

我们使用类名直接调用它们。

例子:

public class ExampleClass3 {
  public static void main(String[] args) {
    DummyClass.num = 5;
    System.out.println("Static variable value: " + DummyClass.num);
    DummyClass.dummyMethod();
  }
}

class DummyClass {
  public static int num = 0;

  public static void dummyMethod() {
    System.out.println("Inside Static Dummy Method");
  }
}

输出:

Static variable value: 5
Inside Static Dummy Method

使用 static 关键字的嵌套类,不引用外部类。我们可以使用 static 关键字在类中创建内部类。

在下面的示例中,我们有一个类 DummyClass,在其中,我们创建了一个名为 InnerClass 的静态类,在这个类中,我们创建了一个方法 dummyMethod()

现在在 ExampleClass3 类中,我们使用 DummyClass.InnerClass 获取 InnerClass 并创建 DummyClass 类的对象并调用 dummyMethod() 函数。

例子:

public class ExampleClass3 {
  public static void main(String[] args) {
    DummyClass.InnerClass dummyClassObj = new DummyClass.InnerClass();
    dummyClassObj.dummyMethod();
  }
}

class DummyClass {
  static class InnerClass {
    void dummyMethod() {
      System.out.println("Inside Static Dummy Method Of The Inner Static Class");
    }
  }
}

输出:

Inside Static Dummy Method Of The Inner Static Class

Java 中的 final 变量

最终变量一旦初始化就不能修改。该示例表明,如果我们创建一个最终变量,然后尝试重新初始化它,我们会在输出中得到一个错误。

public class ExampleClass3 {
  public static void main(String[] args) {
    final int num = 0;
    num = 1;
  }
}

输出:

java: cannot assign a value to final variable num

另一个类不能扩展 final 类。在创建类时使用 final 关键字会限制该类被任何其他类继承。

例子:

public class ExampleClass3 {
  public static void main(String[] args) {
    new DummyClass().dummyMethod();
  }
}

final class DummyClass {
  public void dummyMethod() {
    System.out.println("Inside Static Dummy Method");
  }
}

class DummyClass2 extends DummyClass {
  public void dummyMethod2() {
    System.out.println("Inside Static Dummy Method 2");
  }
}

输出:

java: cannot inherit from final com.tutorial.DummyClass

我们不能覆盖子类中的 final 方法。像 final 类一样,如果函数使用 final 关键字,它不能被其子类覆盖。

public class ExampleClass3 {
  public static void main(String[] args) {
    new DummyClass2().dummyMethod();
  }
}

class DummyClass {
  public final void dummyMethod() {
    System.out.println("Inside Static Dummy Method");
  }
}

class DummyClass2 extends DummyClass {
  public void dummyMethod() {
    System.out.println("Inside Overridden Dummy Method");
  }
}

输出:

java: dummyMethod() in com.tutorial.DummyClass2 cannot override dummyMethod() in com.tutorial.DummyClass
 overridden method is final