1、
2、
3、
1、
package com.meritit.test; class Student { static int numberOfStudents = 0; Student() { numberOfStudents++; } }
每一次创建一个新的Student实例时,成员numberOfStudents都会不断的递增,并且所有的Student实例都访问同一个numberOfStudents变量,实际上int
多个实例共享一个变量似乎不足以让我们对static那么的热情,实际上java引入static却有另外的含义:
2、
3、
non-static
对于static的初始化问题,我们还是值得讨论的。现看下面的例子
package com.meritit.test; public class StaticInit { static int i; int a; public StaticInit() { a=6; System.out.println("a 的初始化"+a); } public static void main(String[] args) { new StaticInit(); } static { i=5; System.out.println("i 的初始化"+i); } }
运行结果如下:
i
a
说起static的“局限“,总结起来就是:在static的方法中仅能够调用其他的static方法和static变量;在static方法中不能以任何方式引用this或super;static变量在定义时必须进行初始化,并且初始化的时间早于非静态。还有一个局限我需要具体的说明一下,static的变量的初始化仅能一次,如下例:
package com.meritit.test; public class Static { T1 t1 = new T1(2); T1 t2 = new T1(3); T1 t3 = new T1(4); public Static() { System.out.println("t1: " + t1.t); System.out.println("t2: " + t2.t); System.out.println("t3: " + t3.t); } public static void main(String args[]) { new Static(); } } class T1 { static int t = 1; T1(int b) { t = b; } }
运行结果:
t1:
4
t2: 4
t3: 4
该static变量只是接受了最后一次的初始化.实际这还是我们先前提到的多个实例共享一个静态的变量的问题。
总之,static就是给我们一个这样的忠告:static的东西在编译时,就已向内存要到了存取空间了。