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
原文地址:https://www.cnblogs.com/java-wgm/p/4143751.html