Java 中的 static 关键字
Java 中的 static 关键字在 Java 编程中被广泛使用。Java static 关键字用于在 Java 中创建类级变量。静态变量和方法是类的一部分,而不是类的实例。
Java中的static关键字
Java static关键字可以在五种情况下使用,如下图所示。我们将在这里讨论其中的四种,第五种是在 Java 8 中引入的,并在Java 8 接口更改中进行了讨论。
-
Java静态变量
我们可以将
static
关键字与类级变量一起使用。静态变量是类变量,不属于 Object/类的实例。由于静态变量在 Object 的所有实例之间共享,因此它们不是线程安全的。通常,静态变量与 final 关键字一起使用,用于所有对象都可以使用的公共资源或常量。如果静态变量不是私有的,我们可以使用ClassName.variableName
//static variable example private static int count; public static String str; public static final String DB_USER = "myuser";
-
Java 静态方法
与静态变量一样,静态方法属于类,而不属于类实例。静态方法只能访问类的静态变量,只能调用类的静态方法。通常,静态方法是实用方法,我们希望将其公开以供其他类使用,而无需创建实例。例如Collections 类。Java Wrapper 类和实用类包含许多静态方法。作为 Java 程序本身入口点的 main() 方法是静态方法。
//static method example public static void setCount(int count) { if(count > 0) StaticExample.count = count; } //static util method public static int addInts(int i, int...js){ int sum=i; for(int x : js) sum+=x; return sum; }
从 Java 8 开始,我们也可以在接口中使用静态方法。有关更多详细信息,请阅读Java 8 接口更改。
-
Java静态块
Java 静态块是当Java ClassLoader将类加载到内存中时执行的一组语句。静态块用于初始化类的静态变量。它主要用于在加载类时创建静态资源。我们无法在静态块中访问非静态变量。我们可以在一个类中拥有多个静态块,尽管这没有多大意义。静态块代码仅在类加载到内存时执行一次。
static{ //can be used to initialize resources when class is loaded System.out.println("StaticExample static block"); //can access only static variables and methods str="Test"; setCount(2); }
-
Java 静态类
我们可以在嵌套类中使用 static 关键字。static 关键字不能用于顶级类。静态嵌套类与任何其他顶级类相同,嵌套只是为了方便打包。阅读:Java 嵌套类
让我们在示例程序中查看 Java 中所有 static 关键字的用法。StaticExample.java
package com.journaldev.misc;
public class StaticExample {
//static block
static{
//can be used to initialize resources when class is loaded
System.out.println("StaticExample static block");
//can access only static variables and methods
str="Test";
setCount(2);
}
//multiple static blocks in same class
static{
System.out.println("StaticExample static block2");
}
//static variable example
private static int count; //kept private to control its value through setter
public static String str;
public int getCount() {
return count;
}
//static method example
public static void setCount(int count) {
if(count > 0)
StaticExample.count = count;
}
//static util method
public static int addInts(int i, int...js){
int sum=i;
for(int x : js) sum+=x;
return sum;
}
//static class example - used for packaging convenience only
public static class MyStaticClass{
public int count;
}
}
让我们看看如何在测试程序中使用静态变量、方法和静态类。TestStatic.java
package com.journaldev.misc;
public class TestStatic {
public static void main(String[] args) {
StaticExample.setCount(5);
//non-private static variables can be accessed with class name
StaticExample.str = "abc";
StaticExample se = new StaticExample();
System.out.println(se.getCount());
//class and instance static variables are same
System.out.println(StaticExample.str +" is same as "+se.str);
System.out.println(StaticExample.str == se.str);
//static nested classes are like normal top-level classes
StaticExample.MyStaticClass myStaticClass = new StaticExample.MyStaticClass();
myStaticClass.count=10;
StaticExample.MyStaticClass myStaticClass1 = new StaticExample.MyStaticClass();
myStaticClass1.count=20;
System.out.println(myStaticClass.count);
System.out.println(myStaticClass1.count);
}
}
java示例程序中上述static关键字的输出是:
StaticExample static block
StaticExample static block2
5
abc is same as abc
true
10
20
请注意,类加载到内存后,静态块代码会首先执行,并且只执行一次。其他输出不言自明。
Java 静态导入
通常我们使用类引用来访问静态成员,从 Java 1.5 开始,我们可以使用 java 静态导入来避免类引用。下面是 Java 静态导入的一个简单示例。
package com.journaldev.test;
public class A {
public static int MAX = 1000;
public static void foo(){
System.out.println("foo static method");
}
}
package com.journaldev.test;
import static com.journaldev.test.A.MAX;
import static com.journaldev.test.A.foo;
public class B {
public static void main(String args[]){
System.out.println(MAX); //normally A.MAX
foo(); // normally A.foo()
}
}
注意 import 语句,对于静态导入,我们必须使用import static
后跟类的完全分类静态成员。要导入类的所有静态成员,我们可以使用 * import static com.journaldev.test.A.*;
。我们只应该在多次使用类的静态变量时使用它,这不利于可读性。更新:我最近制作了一个视频来解释 Java 中的 static 关键字,您应该在下面观看。https ://www.youtube.com/watch ?v=2e-l1vb\_fwM