static 关键字

1.Static变量

           一种被Static修饰的变量叫做静态变量  ;另一种是没被修饰过的叫做 实例变量

两者的区别是:  对于静态变量  在内存中只有一个拷贝, jvm只为静态分配一次内存   ,在加载类的过程中完成静态变量的内存分配,可用类名直接访问

                         对于实例变量,每创建一个实例变量就会为实例变量分配一次内存,  实例变量可以在内存中又多个拷贝 ,互不影响(灵活)。

所以一般在需要实现以下两个功能时使用静态变量:

   1:在对象之间共享值

   2:方便访问变量时



2.  静态方法

    用来修饰成员方法   将其变为类方法 ,  可以直接使用“类名.方法名”的方式进行调用,  常用于工具类


如图: Test 类中   

       静态变量a;  静态方法A  ,非静态方法B

static 关键字


    在   staticTest 类 test方法中  可以直接引用静态方法  ,静态常量

      不能引用非静态方法     静态方法必须先new 出来后  才能调用

static 关键字


静态方法可以直接通过类名调用  ,不依赖任何对象就可以进行访问   因此静态方法中不能使用this和super关键字

static 关键字

  

 3.static 代码块  (可以优化程序性能)

    static代码块也叫静态代码块,  是类中独立于类成员的static语句块, 可以有多个

    位置可以随便放, 它不在任何的方法体内,   jvm在加载类的时候会执行这些静态代码块,

    如果static代码块有多个 ,jvm 将按照他们在类中的出现的先后顺序依次执行它们  ,每个代码块只会执行一次


  1. public class Test5 {   
  2.         private static int a;   
  3.         private int b;  
  4.         static {   
  5.                 Test5.a = 3;   
  6.                 System.out.println(a);   
  7.                 Test5 t = new Test5();   
  8.                 t.f();   
  9.                 t.b = 1000;   
  10.                 System.out.println(t.b);   
  11.         }  
  12.         static {   
  13.                 Test5.a = 4;   
  14.                 System.out.println(a);   
  15.         }  
  16.         public static void main(String[] args) {   
  17.                 // TODO 自动生成方法存根   
  18.         }  
  19.         static {   
  20.                 Test5.a = 5;   
  21.                 System.out.println(a);   
  22.         }   
  23.         public void f() {   
  24.                 System.out.println("hhahhahah");   
  25.         }   
  26. }  

static 关键字