Java中的static关键字

在Java中,static关键字在java编程中被广泛使用。Java static关键字用于在java中创建一个类级别的变量。静态变量和方法属于类,而不是类的实例。

Java中的static关键字

Java静态关键字可以在下图中显示的五种情况下使用。 我们将在这里讨论其中四种,第五种是在Java 8中引入的,已在Java 8接口变更中讨论过。

  1. Java静态变量

    我们可以在类级别变量中使用static关键字。静态变量是类变量,不属于类的对象/实例。由于静态变量在所有对象的实例之间共享,它们不是线程安全的。通常,静态变量与final关键字一起用于所有对象都可以使用的公共资源或常量。如果静态变量不是私有的,我们可以使用ClassName.variableName来访问它。

        //静态变量示例
        private static int count;
        public static String str;
        public static final String DB_USER = "myuser";
    
  2. Java静态方法

    和静态变量一样,静态方法属于类而不属于类实例。静态方法只能访问类的静态变量并调用类的静态方法。通常,静态方法是我们希望公开供其他类使用而无需创建实例的实用方法。例如,Collections类Java包装类和实用程序类包含许多静态方法。作为Java程序的入口点的main()方法本身就是一个静态方法。

    //静态方法示例
    public static void setCount(int count) {
        if (count > 0)
            StaticExample.count = count;
    }
    
    //静态实用方法
    public static int addInts(int i, int... js) {
        int sum = i;
        for (int x : js) sum += x;
        return sum;
    }
    

    从Java 8开始,接口也可以包含静态方法。更多详细信息,请阅读Java 8接口变更

  3. Java 静态块

    Java 静态块是一组语句,在类被 Java 类加载器加载到内存中时执行。静态块用于初始化类的静态变量。通常在类加载时用于创建静态资源。我们不能在静态块中访问非静态变量。一个类中可以有多个静态块,尽管这没有太多意义。静态块的代码只在类加载到内存时执行一次。

        static{
            // 用于在类加载时初始化资源
            System.out.println("StaticExample static block");
            // 只能访问静态变量和方法
            str="Test";
            setCount(2);
        }
    
  4. Java静态类

    我们可以使用static关键字嵌套类。static关键字不能用于顶级类。静态嵌套类与任何其他顶级类相同,仅为了包装方便而嵌套。阅读:Java嵌套类

让我们在一个示例程序中看看 Java 中 static 关键字的所有用法。StaticExample.java

package com.journaldev.misc;

public class StaticExample {

    // 静态代码块
    static{
        // 可用于在类加载时初始化资源
        System.out.println("StaticExample static block");
        // 只能访问静态变量和方法
        str="Test";
        setCount(2);
    }
    
    // 同一个类中可以有多个静态代码块
    static{
        System.out.println("StaticExample static block2");
    }
    
    // 静态变量示例
    private static int count; //kept private to control its value through setter
    public static String str;
    
    public int getCount() {
        return count;
    }

    // 静态方法示例
    public static void setCount(int count) {
        if(count > 0)
        StaticExample.count = count;
    }
    
    // 静态实用方法
    public static int addInts(int i, int...js){
        int sum=i;
        for(int x : js) sum+=x;
        return sum;
    }

    // 静态类示例 - 仅用于包装方便
    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);
        
        // 非私有静态变量可以用类名访问
        StaticExample.str = "abc";
        StaticExample se = new StaticExample();
        System.out.println(se.getCount());
        // 类静态变量和实例静态变量相同
        System.out.println(StaticExample.str +" is same as "+se.str);
        System.out.println(StaticExample.str == se.str);
        
        // 静态嵌套类与普通顶级类类似
        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 static,后跟类的完全限定静态成员。要导入类的所有静态成员,我们可以使用*,如import static com.journaldev.test.A.*;。我们应该只在多次使用类的静态变量时使用它,这样可读性不好。更新:我最近制作了一个视频来解释Java中的静态关键字,你应该在下面观看。https://www.youtube.com/watch?v=2e-l1vb\_fwM

Source:
https://www.digitalocean.com/community/tutorials/static-keyword-in-java