# Java `static`关键字

> 原文： [https://javabeginnerstutorial.com/core-java-tutorial/java-static-keyword/](https://javabeginnerstutorial.com/core-java-tutorial/java-static-keyword/)

## 什么是`static`

静态是非访问修饰符。

## 适用于

可以将`Static`关键字应用于

*   *方法*
*   *变量*
*   *嵌套在另一个类中的类*
*   *初始化块*

## 不适用于

`static`关键字不能应用于

*   类（未嵌套）
*   构造器
*   接口
*   方法局部内部类（与嵌套类之间的区别）
*   内部类方法
*   实例变量
*   局部变量

## Java 中`static`关键字的目的

静态词可用于将变量或方法附加到类。 标记为静态的变量或方法属于该类，而不是任何特定实例。 与[实例变量相反。](https://javabeginnerstutorial.com/core-java-tutorial/instance-variable-java/)

## 如何调用

可以在没有类实例的情况下使用静态变量和方法。 只有类才需要调用静态方法或静态变量。

```java
/*
 * Here we will learn to access Static method and Static Variable.
 */
public class JavaStaticExample {

	static int i = 10;

	static void method() {
		System.out.println("Inside Static method");
	}

	public static void main(String[] args) {

		// Accessing Static method
		JavaStaticExample.method();

		// Accessing Static Variable
		System.out.println(JavaStaticExample.i);

		/*
		 * No Instance is required to access Static Variable or Method as we
		 * have seen above. Still we can access the same static variable and
		 * static method using Instace references as below.
		 */
		JavaStaticExample obj1 = new JavaStaticExample();
		JavaStaticExample obj2 = new JavaStaticExample();

		/*
		 * Accessing static variable in Non Static way. Compiler will warn you
		 * with below warning.
		 *
		 * The static field JavaStaticExample.i should be accessed in a static
		 * way.
		 */
		System.out.println(obj1.i);
		// Accessing satic method using reference.
		// Warning by compiler
		// "The static method method() from the type JavaStaticExample should be accessed in a static way"
		obj1.method();
	}
}
```

上述程序的输出

```java
Inside Static method
10
10
Inside Static method
```

**注**：`static`关键字可以与变量和方法一起使用。 它**不适用于**类。

## 类变量 – 静态字段

类变量（也称为静态字段）在类中的所有对象之间共享特征。 当您声明字段为静态字段时，只会创建关联变量的单个实例，该实例对于该类的所有对象都是通用的。 因此，当一个对象更改类变量的值时，它将影响该类的所有对象。 我们可以通过使用类的名称来访问类变量，而不必使用对类内单个对象的引用。 即使不存在该类的对象，也可以访问静态变量。 类变量使用`static`关键字声明。

## 类方法 – 静态方法

可以在没有类实例的情况下调用类似于类变量的类方法。 类方法通常用于为 Java 程序提供全局函数。 例如，`java.lang.Math`包中的方法是类方法。 您不能从静态方法内部调用非静态方法。

## `static`关键字规则

*   标记为`static`的**变量或方法**属于**类** ，而不是任何特定实例。
*   **静态方法或变量**可以在不创建或引用类实例的情况下使用。
*   如果存在实例，则该类的所有实例将共享一个类的静态变量，这将导致 **仅一个副本** 。
*   静态方法不能访问非静态变量，也不能直接调用非静态方法（它可以通过*实例*调用或访问方法或变量）。

## 备忘单

*   **静态**是非访问修饰符。
*   **静态**修饰符可以应用于变量或方法，块或内部类。
*   **静态成员**仅属于类而不是实例。
*   静态方法**无法访问**实例变量*。
*   静态方法**不能替代**，因为它们是特定于类的，并且不属于实例。
*   可以将**重新定义**静态方法。
*   如果一个类包含任何静态块，则仅当将该类加载到 JVM 中时，才执行该块。 创建多个实例不会多次运行静态块。 仅构造器将执行多次。
*   如果调用`Class.forName("class_name")`，则将执行类的静态块。

<https://www.youtube.com/embed/QZwgz9tIy7I?start=1&amp;feature=oembed>

