在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变量值。