Java | static关键字

279 阅读1分钟

在类中,用static声明的成员变量为静态成员变量,也称为类变量。

关于static,需要注意的:

  • 类变量可以直接通过类调用,不需要依赖对象来进行访问
  • 类变量被所有对象共享,在内存中只有一个副本,只会在类初次加载的时候被初始化一次
  • 类变量的生命周期和类相同,在整个应用程序执行期间都有效

example1展示了在不同的作用域里(两个try块),类变量也不会重新初始化。

// example1
public class Main {
	public static void main(String[] args) {
		try {
			AbstractRelNode node = new AbstractRelNode();
			System.out.println(node.id);
			AbstractRelNode node0 = new AbstractRelNode();
			System.out.println(node0.id);
		
		} catch (Exception e) {
			
		}
		try {
			AbstractRelNode node = new AbstractRelNode();
			System.out.println(node.id);
			
		} catch (Exception e) {
			
		}
		/**
		 * output:
		 * 0
		 * 1
		 * 2
		 */		
	}
}
class AbstractRelNode {
	static int nextId = 0;
	public int id;
	public AbstractRelNode() {
		this.id = nextId++;
	}
}

example2展示了在不同的线程里,类变量也不会重新初始化

public class Main {
	public static void main(String[] args) {
		try {
			AbstractRelNode node = new AbstractRelNode();
			System.out.println(node.id);
			AbstractRelNode node0 = new AbstractRelNode();
			System.out.println(node0.id);
		
		} catch (Exception e) {
			
		}
		Thread t = new MyThread();
		t.start();
		/**
		 * output:
		 * 0
		 * 1
		 * node id is 2 from thread 12
		 */
		
	}
}
class AbstractRelNode {
	static int nextId = 0;
	public int id;
	public AbstractRelNode() {
		this.id = nextId++;
	}
}
class MyThread extends Thread {
	@Override
	public void run() {
		AbstractRelNode node = new AbstractRelNode();
		System.out.format("node id is %d from thread %d", node.id,this.getId());
	}
}

上述例子说明了,类变量在整个应用程序运行期间只会被初始化一次