Java中的静态关键字指南

136 阅读4分钟

在Java中,有大量的保留关键字不能作为变量或标识符的名称使用。Java中经常使用的一个关键字是"静态"关键字。静态关键字在Java中被大量使用的最重要原因是为了有效地管理内存。一般来说,如果你想访问一个类中的变量或方法,你首先需要创建一个该类的实例或对象。然而,在某些情况下,你可能只想访问一个类的几个方法或变量,而你不想为该类创建一个新的实例来访问这些成员。这时,你可以使用Java中的static关键字。

static关键字允许用于5个方面

  • 导入语句
  • 类级变量
  • 类级块
  • 方法
  • 类级的内部类

静态导入语句

在Java 1.5版本中,他们引入了静态导入的概念。在静态导入的帮助下,我们可以直接访问一个类的静态成员,而不需要类名或任何对象。例如:我们总是通过使用Math类即Math.sqrt()来使用Math类的sqrt()方法,但通过使用静态导入,我们可以直接访问sqrt()方法。
此外,根据SUN microSystem的说法,这将提高代码的可读性并加强编码。但根据编程专家的意见,有时它会导致混乱。

静态变量

  • 在创建语句中带有静态关键字的类级变量被称为静态变量。
  • JVM以默认的方式执行静态变量,在类加载时提供内存位置,并以相同的顺序从上到下执行它们的定义。
  • JVM在方法区为静态变量提供内存。
  • 静态变量在类加载到JVM时就获得了生命,并且在类从JVM中删除或JVM关闭之前一直可用。
  • 此外,它的范围是类的范围,意味着它可以在整个类中直接通过它的名字进行访问,如果它是非私有变量,则可以在类外通过它的类名**(className.staticVariableName**)进行访问。
  • 最后,我们不允许在方法中定义静态变量或作为参数。

静态块

  • static块是一个类级的无名块,在其原型中只包含static关键字。
  • 之所以需要它,是因为如果我们只想在类加载时执行逻辑,就使用静态块。
  • 允许在楼梯间内的逻辑
    • 初始化静态变量
    • 注册本地库
    • 了解类的加载顺序,等等

静态方法

  • 静态方法是一个在其定义中带有静态关键字的方法。
  • 首先,不需要创建任何类的实例来调用这个方法,我们可以使用className.staticMethodName来调用。
  • 其次,除了main方法,JVM不会自己执行静态方法。只有当它们被明确地从main方法中调用,或从静态变量作为其赋值语句或从静态块中调用时,它们才被执行。
  • 最后,所有的静态方法逻辑都是在方法区中持续存在的,这些逻辑在主线程的java堆栈区通过创建单独的堆栈框架来执行。

静态内部/嵌套类

  • 静态类是在一个类内部创建的类,在Java中被称为静态嵌套类。
  • 它可以通过外部类的名称进行访问。
  • 它可以访问外类的静态数据成员,包括私有的。
  • 静态嵌套类不能访问非静态(实例)数据成员和方法。

静态关键字的控制流程

public class Class10StudentDetail {

    private static int class10ACount = 10;
    private static int class10BCount = 20;
    private static int totalClass10Count;
    static {
         totalClass10Count = fullDetail();
    }


    public static void main(String[] args) {
        System.out.println("Total class 10th students count : " + totalClass10Count);
    }

    public static int fullCount() {
        return class10ACount + class10BCount;
    }
}
  • 上面是一个包含静态变量、静态方法和静态块的代码例子。
  • 当classloader加载这个类时,jvm将按照定义的顺序执行静态变量和静态块。
  • 首先,jvm执行静态变量class10ACount,并根据数据类型创建内存的默认值,然后如果初始化在同一行中可用,那么它将以该值初始化(在上面的例子中是10)。
  • 第二,jvm执行静态变量class10BCount,并根据数据类型创建默认值的内存,然后如果同一行有初始化,那么它将以该值初始化(上例中是20)。
  • 第三,JVM执行静态变量totalClass10Count,并根据数据类型创建默认值的内存,现在对于这个变量,我们没有初始化,那么就让它保持默认值。
  • 现在JVM执行静态块(如果静态块是在静态变量之间定义的,那么它将根据定义的顺序在两者之间执行),我们通过调用静态方法fullCount()来初始化变量totalClass10Count(因为JVM默认不会调用静态方法,而是期待主方法)。
  • 最后,JVM执行main方法,在控制台打印totalClass10Count变量值。