• 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
  • 相关阅读:
    ETL概念集锦
    想要快速泡大麦茶的4种方法
    Suggest blowing out the dust
    Pessimistic and optimistic locking
    操作系统简介
    初学计算机基础
    JavaScript筑基篇(三)->JS原型和原型链的理解
    网页瀑布流效果实现的几种方式
    javascript的基本语法、数据结构
    javascript如何列出全局对象的非原生属性。
  • 原文地址:https://www.cnblogs.com/java-wgm/p/4143751.html
Copyright © 2020-2023  润新知