java中static关键字可用于修饰:
1.属性:表示该属性变量在类被加载时即被创建并初始化,类加载过程只进行一次,因此静态变量也只被创建一次
2.方法:静态方法为类的公有方法,可直接用‘类名.方法名'访问,静态方法不可访问本类中的非静态成员,子类不可
将父类的静态方法覆盖为非静态的,反之亦然。此外,静态方法中不能使用this关键字,也不能用super关键字去访问
父类静态方法,可直接用'父类.父类静态方法名'访问。
3.代码块:静态初始化代码块,在类被加载时执行一次,可用于类的初始化
具体实例:
1)下面的例子中,静态变量staticVar,只在类第一次加载时被创建并初始化,以后无论创建多少类对象,该变量都不再
加载,因此每次都在原有基础上增加1,而实例变量instanceVar,只有当创建类对象时才对其进行创建并在构造函数中
加1,每创建一个对象,就对应创建一个instanceVar实例变量。注意:在静态方法中访问instanceVar将报错。
2)UseStatic类中,类加载时初始化顺序为:静态变量-->静态代码块
1 package com.pattywgm.a_fundamental; 2 3 import org.junit.Test; 4 5 /** 6 * 7 * @author patty 8 * @time 2014-12-4 9 * @todo 考查static关键字的用法 10 */ 11 public class StaticTest { 12 //默认为0 ,可不指定初始值 13 static int staticVar; //静态变量,在类初始化时加载,只加载一次 14 int instanceVar; //实例变量 15 16 public StaticTest() { 17 staticVar++; 18 instanceVar++; 19 System.out.println("staticVAr= "+staticVar+" instanceVar= "+instanceVar); 20 21 } 22 23 public void doSth(){ 24 System.out.println("Do something..."); 25 } 26 27 public static void doSthStatic(){ 28 // System.out.println(instanceVar); //不能对非静态字段 instanceVar 进行静态引用 29 System.out.println("Do something static..."); 30 } 31 32 @Test 33 public void testStatic(){ 34 //单元测试会首先创建一个类的对象,然后再调用该测试方法 35 new StaticTest(); 36 } 37 38 public static void main(String[] args){ 39 // StaticTest staticTest; 40 System.out.println(staticVar); //此时还未创建对象,staticVar值未增加,仍为0 41 //每创建一个StaticTest对象,staticVar值增加1,instanceVAr值由0加1 42 StaticTest staticTest1=new StaticTest(); // 43 StaticTest staticTest2=new StaticTest(); 44 StaticTest staticTest3=new StaticTest(); 45 System.out.println("instanceVar(whole) is:"+staticTest3.instanceVar); 46 int instanceVar=200; //局部变量优先 47 System.out.println("instanceVar(local) is:"+instanceVar); 48 System.out.println("staticVar(whole) is:"+staticVar); 49 int staticVar=500; //局部变量优先 50 System.out.println("staticVar(local) is:"+staticVar); 51 52 } 53 } //end StaticTest 54 /** 55 * 56 * @author patty 57 * @time 2014-12-4 58 * @todo 考查static变量/方法/代码块 59 * 类加载时加载顺序为:静态变量,静态代码块,然后才调用静态方法 60 */ 61 class UseStatic{ 62 public static int a=3; 63 static int b; 64 65 static void method(int c){ 66 System.out.println("C: "+c); 67 System.out.println("A: "+a); 68 System.out.println("B: "+b); 69 } 70 //代码块 71 static{ 72 System.out.println("Static block..."); 73 System.out.println("a= "+a+" b= "+b);// 3 0 74 b=a*5; 75 System.out.println("a= "+a+" b= "+b);// 3 15 76 } 77 78 public static void main(String[] args){ 79 method(24); 80 System.out.println(StaticTest.staticVar); //0 81 } 82 }//end UseStatic 83 84 class StaticDemo extends StaticTest{ 85 static int sta; 86 int stb; 87 public StaticDemo() { 88 //super(); 89 sta++; 90 stb++; 91 System.out.println("sta= "+sta+" stb= "+stb); 92 } 93 //此处不可将doSth声明为静态方法,即子类不能以static覆盖父类的非静态方法 94 public void doSth(){ 95 super.doSth(); 96 System.out.println("Sub do something"); 97 } 98 //此处必须加上static修饰符,因为实例方法不能覆盖 StaticTest 中的静态方法 99 public static void doSthStatic(){ 100 StaticTest.doSthStatic(); //静态方法不可用super关键字,用父类名直接访问 101 System.out.println("Sub do something static"); 102 } 103 104 public static void main(String[] args){ 105 System.out.println("sta= "+sta); 106 new StaticDemo().doSth(); 107 doSthStatic(); 108 } 109 } 110 111 ///:output: 112 /* StaticTEst 113 * testStatic 114 staticVAr= 1 instanceVar= 1 115 staticVAr= 2 instanceVar= 1 116 * main 117 0 118 staticVAr= 1 instanceVar= 1 119 staticVAr= 2 instanceVar= 1 120 staticVAr= 3 instanceVar= 1 121 instanceVar(whole) is:1 122 instanceVar(local) is:200 123 staticVar(whole) is:3 124 staticVar(local) is:500 125 126 *StaticDemo 127 sta= 0 128 staticVAr= 1 instanceVar= 1 129 sta= 1 stb= 1 130 Do something... 131 Sub do something 132 Do something static... 133 Sub do something static 134 */ 135 //:~~~