原文: https://howtodoinjava.com/java/basics/java-static-keyword/
Java 中的static
关键字可以应用于变量,方法,块,导入和内部类。 在本教程中,我们将通过示例学习在这些地方使用static
关键字的效果。
Table of Contents
1\. Static Variable
2\. Static Method
3\. Static Import Statement
4\. Static Block
5\. Static Class
6\. Summary
要语句静态变量,请在变量语句中使用static
关键字。 静态变量语法为:
ACCESS_MODIFER static DATA_TYPE VARNAME;
例如,以这种方式语句Integer
类型的公共静态变量。
public static Integer staticVar;
关于静态变量的最重要的事情是它们属于类级别。 这意味着在运行时中只能有变量的一个副本。
在类定义中定义静态变量时,类的每个实例都可以访问该单个副本。 类的单独实例不会像非静态变量一样拥有自己的本地副本。
public class JavaStaticExample
{
public static void main(String[] args)
{
DataObject objOne = new DataObject();
objOne.staticVar = 10;
objOne.nonStaticVar = 20;
DataObject objTwo = new DataObject();
System.out.println(objTwo.staticVar); //10
System.out.println(objTwo.nonStaticVar); //null
DataObject.staticVar = 30; //Direct Access
System.out.println(objOne.staticVar); //30
System.out.println(objTwo.staticVar); //30
}
}
class DataObject {
public static Integer staticVar;
public Integer nonStaticVar;
}
Output:
10
null
30
30
注意我们如何将值更改为 30,并且两个对象现在都看到更新后的值 30。
您应该已经注意到的另一件事是,我们如何能够使用其类名即DataObject.staticVar
访问静态变量。 我们无需创建任何实例即可访问static
变量。 它清楚地表明静态变量属于类范围。
要语句静态方法,请在方法语句中使用static
关键字。 静态方法语法为:
ACCESS_MODIFER static RETURN_TYPE METHOD_NAME;
例如,以这种方式声明了一个Integer
类型的公共静态变量。
public static Integer staticVar;
public static Integer getStaticVar(){
return staticVar;
}
几件事要记住。
- 您只能访问静态方法中的静态变量。 如果您尝试访问任何非静态变量,则会生成编译器错误,并显示消息“无法对非静态字段
nonStaticVar
进行静态引用”。 - 静态方法可以通过其类引用进行访问,而无需创建类的实例。 尽管您也可以使用实例引用进行访问,但是与通过类引用进行访问相比,它没有任何区别。
- 静态方法也属于类级别范围。
public class JavaStaticExample
{
public static void main(String[] args)
{
DataObject.staticVar = 30; //Direct Access
Integer value1 = DataObject.getStaticVar(); //access with class reference
DataObject objOne = new DataObject();
Integer value2 = objOne.getStaticVar(); //access with instance reference
System.out.println(value1);
System.out.println(value2);
}
}
class DataObject
{
public Integer nonStaticVar;
public static Integer staticVar; //static variable
public static Integer getStaticVar(){
return staticVar;
}
}
Output:
30
30
普通的导入语句从包中导入类,因此可以在不引用包的情况下使用它们。 同样,静态导入语句从类导入静态成员,并允许在没有类引用的情况下使用它们。
静态导入语句也有两种形式:单静态导入和静态按需导入。 单静态导入语句从类型中导入一个静态成员。 静态按需导入语句将导入类型的所有静态成员。
//Single-static-import declaration:
import static <<package name>>.<<type name>>.<<static member name>>;
//Static-import-on-demand declaration:
import static <<package name>>.<<type name>>.*;
例如,System.out
是
//Static import statement
import static java.lang.System.out;
public class JavaStaticExample
{
public static void main(String[] args)
{
DataObject.staticVar = 30;
out.println(DataObject.staticVar); //Static import statement example
}
}
class DataObject
{
public static Integer staticVar; //static variable
}
Output:
30
阅读更多: Java 中的静态导入语句
静态块是类初始化代码的一部分,并用static
关键字包装。
public class Main {
//static initializer
static {
System.out.println("Inside static initializer");
}
}
当将类加载到内存中时,将执行静态块。 一个类可以具有多个静态块,并且这些静态块将按照它们在类定义中出现的相同顺序执行。
import static java.lang.System.out;
class DataObject
{
public Integer nonStaticVar;
public static Integer staticVar; //static variable
//It will be executed first
static {
staticVar = 40;
//nonStaticVar = 20; //Not possible to access non-static members
}
//It will be executed second
static {
out.println(staticVar);
}
}
Output:
40
在 Java 中,可以将静态类作为内部类。 就像其他静态成员一样,嵌套类也属于类范围,因此可以在没有外部类对象的情况下访问内部静态类。
public class JavaStaticExample
{
public static void main(String[] args)
{
//Static inner class example
System.out.println( DataObject.StaticInnerClas.innerStaticVar );
}
}
class DataObject
{
public Integer nonStaticVar;
public static Integer staticVar; //static variable
static class StaticInnerClas {
Integer innerNonStaticVar = 60;
static Integer innerStaticVar = 70; //static variable inside inner class
}
}
请注意,静态内部类无法访问外部类的非静态成员。 它只能访问外部类的静态成员。
public class JavaStaticExample
{
public static void main(String[] args)
{
//Static inner class example
DataObject.StaticInnerClas.accessOuterClass();
}
}
class DataObject
{
public Integer nonStaticVar;
public static Integer staticVar; //static variable
static {
staticVar = 40;
//nonStaticVar = 20; //Not possible to access non-static members
}
public static Integer getStaticVar(){
return staticVar;
}
static class StaticInnerClas
{
public static void accessOuterClass()
{
System.out.println(DataObject.staticVar); //static variable of outer class
System.out.println(DataObject.getStaticVar()); //static method of outer class
}
}
}
Output:
40
让我们总结一下有关 Java 中static keyword
使用情况的所有信息。
- 静态成员属于类。 无需创建类实例即可访问静态成员。
- 静态成员(变量和方法)只能在静态方法和静态块内访问。
- 非静态成员不能在静态方法,块和内部类中访问。
- 一个类可以有多个静态块,并且将按照它们在类定义中出现的顺序执行它们。
- 一个类只有在外部类内部语句为内部类时才能是静态的。
- 静态导入可用于从类中导入所有静态成员。 可以在没有任何类引用的情况下引用这些成员。
学习愉快!
参考文献: