在类中,用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());
}
}
上述例子说明了,类变量在整个应用程序运行期间只会被初始化一次