jvm总结

类的初始化干了哪些事?(1,给类静态变量赋值(不包括静态常量),而不是初始化类静态变量;2,加载static块,无先后顺序)

类的实例化干了哪些事?(给非static变量赋值,加载构造块,加载构造函数)

类初始化之后不一定实例化;

类实例化完成之后不一定初始化完成

static变量是类级别的变量

static块可以看做是一个没有名字、没有参数、没有返回值的静态方法

static final 的值如果能确定,则不会初始化类;如果确定不了(值是一个new 对象),则还是会初始化类

(一)静态变量:线程非安全

   1、静态变量:使用static关键字定义的变量。static可以修饰变量和方法,也有static静态代码块。被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。

    用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它的类的对象时,不生成static变量的副本,而是类的所有实例共享同一个static变量。

    2、静态变量使用的场景:

    (1)对象间共享值时

    (2)方便访问变量时

    3、静态方法使用注意事项:

1. 无法在静态方法里引用实例变量、也无法调用实例方法,但是可以调用静态变量和静态方法,你甚至可以在static静态代码块里调用main方法,都是没有问题的
 
2. 无法在静态方法里使用this关键字和super关键字(因为this关键字指向该方法所属的对象,而静态方法是属于类级的,不存在对象一说;至于super关键字,只要不是用在构造方法里,那么 
   它就是指向父类对象的,而静态方法是不能引用实例对象的,因此也不能使用super关键字)
 
3. 无法在静态方法里声明其他静态变量(其实这一点不只是静态方法才适用,包括实例方法也无法在方法体中声明静态变量,因为静态变量属于类变量)
 
4. 无法在静态方法里使用域修饰符来声明变量:public、protected、private,只能使用默认的访问域(这一点实例方法也是适用的)
5, 不能在静态方法内直接调用非静态方法;
static静态代码块其实完全可以看做是一个没有名字、没有参数、没有返回值的静态方法,这个静态方法会在main方法执行前执行,而且是主动执行的,不需要任何显示调用,除此之外它和普通的静态方法没有任何区别,因此对普通静态方法适用的规则也适用于该static静态代码块,比如:
 
 
 
原文地址:https://www.cnblogs.com/jichen/p/8605988.html