static关键字用法

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 //:~~~
View Code

 

你可能感兴趣的:(static)