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。
本篇大部分只是来自:链接

浙公网安备 33010602011771号