Java static关键字
原文: https://javabeginnerstutorial.com/core-java-tutorial/java-static-keyword/
什么是static
静态是非访问修饰符。
适用于
可以将Static
关键字应用于
- 方法
- 变量
- 嵌套在另一个类中的类
- 初始化块
不适用于
static
关键字不能应用于
- 类(未嵌套)
- 构造器
- 接口
- 方法局部内部类(与嵌套类之间的区别)
- 内部类方法
- 实例变量
- 局部变量
Java 中static关键字的目的
静态词可用于将变量或方法附加到类。 标记为静态的变量或方法属于该类,而不是任何特定实例。 与实例变量相反。
如何调用
可以在没有类实例的情况下使用静态变量和方法。 只有类才需要调用静态方法或静态变量。
/*
* 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();
}
}
上述程序的输出
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&feature=oembed