static关键字使用
static关键字
对一些公共使用的数据,比如是饭店筷子,不可能说每个人去饭店吃饭的时候自带一双筷子,饭店的筷子对于进店吃饭的对象都是公共的;
静态变量,跟其他变量不同的是,它是与类关联的,其他变量则是属于某个对象,每一个对象就会有这个数据的拷贝;
被static 修饰的变量都是共享的,修改属性的值会全局改变.访问静态变量可以通过"类名.属性来访问";
static也可以描述方法,称为静态方法,访问静态方法可以通过"类名.方法名"来访问,不需要创建对象;
*注意在普通方法里面不能用static修饰变量,比如如下语句:
public void xxx{ static int a=1; //报错 }
如下通过代码体现静态关键字的特性,声明静态变量和普通变量分别对它们进行赋值操作来体现静态的特性.
1 public class staticdemo { 2 public int a = 1; // 非static属性,每个实例都是独享的. 3 public static int b = 2; 4 5 static{ 6 7 System.out.println("static block"); 8 9 } 10 11 12 public void foo1() 13 { 14 System.out.println("non-static"); 15 } 16 17 public static void foo2() 18 { 19 System.out.println("static method"); 20 } 21 22 public static void main(String[] args) { 23 24 staticdemo sd = new staticdemo(); 25 System.out.println(sd.a); 26 27 31 32 System.out.println(sd.b); 33 System.out.println(staticdemo.b); 34 35 36 37 staticdemo sd1 = new staticdemo(); 38 staticdemo sd2 = new staticdemo(); 39 40 sd1.a = 2; 41 sd2.a = 3; 42 System.out.println("sd1.a=" + sd1.a); 43 System.out.println("sd2.a=" + sd2.a); 44 45 System.out.println("修改sd1.b=3,sd2.b=4前,sd1.b=" + staticdemo.b 46 + " sd2.b=" + staticdemo.b); 47 48 sd1.b = 3; 49 sd2.b = 4; 50 System.out.println("修改sd1.b=3,sd2.b=4后,sd1.b=" + staticdemo.b 51 + " sd2.b=" + staticdemo.b); 52 53 54 55 } 56 } 57
通过改变静态变量的值,可以看到两个对象的值都改变了.其实该变量作为类变量,所有对象只是共享一个值,通过改变这个变量的值,其他对象访问它自然也是访问到改变之后的值;
运行结果:
static block
1
2
2
sd1.a=2
sd2.a=3
修改sd1.b=3,sd2.b=4前,sd1.b=2 sd2.b=2
修改sd1.b=3,sd2.b=4后,sd1.b=4 sd2.b=4
__________________________________________________________________________________________________________________________
只要是被static修饰的属性,在调用含有静态资源的类的时候,如果静态还没有加载过的时候,就先执行静态资源(除了方法),
等加载完静态在轮到其他资源.
(参考类的执行过程)
所以这里还要注意一个问题:
比如上面的例子,访问成员a使用如下代码时
public static void main(String[] args) { //staticdemo sd = new staticdemo(); //System.out.println(sd.a);
System.out.println(staticdemo.a); //错误代码
运行时就会报错,原因是因为没用static修饰的方法/属性,不能通过(类名.属性)的方式来访问,一定要先创建实例,再用变量名.属性来访问.