static{}块

static{}

static{}  是用来初始化静态变量和调用静态方法的。

class Test{
        public static int X=100;
    public final static int Y=200;
    public Test(){
        System.out.println("Test构造函数执行");
    }
    static{
        System.out.println("static语句块执行");
    }
    public static void display(){
        System.out.println("静态方法被执行");
    }
    public void display_1(){
        System.out.println("实例方法被执行");
    }
}
public class StaticBlockTest{
    public static void main(String args[]){
        try{
                Class.forName("Test");   
                    Class.forName("Test"); 
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }
          
    }    
}

虽然在try中执行了两次Class.forName("Test")  但是Test中的static{}只执行了一次,这便是他的特性(因为static{}是随类加载的,而类在java虚拟机中只加载一次)。

*************************************

关于Class.forName("Test")          其实这个东西的功能和 Test test = new Test();  相同。。  只是这样执行Test类中的方法会更加方便,因为不需要去生成对象然后 r.display()···· 这样一个一个的去调用。

关于类加载   原理就是遇到则加载不遇则不加载

****************************************

static加载是随着类加载而完成的。 即类加载时会将static{}等静态量统一加载在方法区。

 

还有一点好玩的是,加载类时会加载静态常量,但是当别的类调用静态常量时,却不会主动加载它所在的类,这便是静态常量的好处。因为他相比于非静态常量,即使没有加载类或者初始化对象,也能调用。这也是静态常量和非静态常量的一点区别。

 

 

对于static{}的执行顺序是  先声明的先执行,执行完static{}才会执行别的调用语句

 

类加载特性 :
      *在虚拟机的生命周期中一个类只被加载一次。
      *类加载的原则:延迟加载,能少加载就少加载,因为虚拟机的空间是有限的。
      *类加载的时机:
      1)第一次创建对象要加载类.
      2)调用静态方法时要加载类,访问静态属性时会加载类。
      3)加载子类时必定会先加载父类。
      4)创建对象引用不加载类.
      5) 子类调用父类的静态方法时
          (1)当子类没有覆盖父类的静态方法时,只加载父类,不加载子类
          (2)当子类有覆盖父类的静态方法时,既加载父类,又加载子类
      6)访问静态常量,如果编译器可以计算出常量的值,则不会加载类,例如:public static final int a =123;否则会加载类,例如:public static final int a = math.PI。

 

 

本篇大部分只是来自:链接

 

posted @ 2020-03-06 16:04  张大帅zz  阅读(200)  评论(0)    收藏  举报