static--挖掘

第一:
首先写一段代码:
public class test{
public static test t1=new test( );
public static test t2=new test( );
//构造代码块:
{
System.out.println(“构造块”);
}
static {
System.out.println(“静态块”);
}
public static void main(String [] args){
test t=new test();
}
}
那么程序执行顺序来了:
静态域>main()>构造块>构造方法
1 程序进来,类加载时,首先执行静态域————> 按顺序执行,首先接触到静态变量,那么执行两次,然后执行构造;
2 进入main方法
3 构造方法执行
输出结果为: 构造块 构造块 静态块 构造块

第二:Java中的生命周期
类的生命周期:
1 类的加载 2 类的连接 3类的初始化 4 类的使用 5 类的卸载终结
我们编写一个Java代码,经过编译生成class文件,JVM对他识别Java的生命周期也就伴随着class的生命,你live我live,你dead我dead,关于加载,将class文件的找到类的信息将其加载到方法区,然后在堆区实例化一个Java.lang。Class文件,也就是为什么当我们使用Java.lang中的方法不需要导入包,作为方法区这个类的入口,这个功能是在JVM以外实现的,这样我们可以再我们的编译器上选择如何获取这个类,不同的JVM实现的方式不同,有的采用需要时加载,也有预先加载的。
2 连接
连接一般是加载阶段和初始化阶段交叉进行,过程由以下三部分组成:
(1)验证:确定该类是否符合java语言的规范,有没有属性和行为的重复,继承是否合理,总之,就是保证jvm能够执行
(2)准备:主要做的就是为由static修饰的成员变量分配内存,并设置默认的初始值
默认初始值如下:

                1.八种基本数据类型默认的初始值是0 
                2.引用类型默认的初始值是null 

                3.有static final修饰的会直接赋值,例如:static final int x=10;则默认就是10.

    (3)解析:这一阶段的任务就是把常量池中的符号引用转换为直接引用,说白了就是jvm会将所有的类或接口名、字段名、方法名转换为具体的内存地址。

3.初始化 
    初始化这个阶段就是将静态变量(类变量)赋值的过程,即只有static修饰的才能被初始化,执行的顺序就是:父类静态域或着静态代码块,然后是子类静态域或者子类静态代码块(静态代码块先被加载,然后再是静态属性)
4.使用 
    在类的使用过程中依然存在以下三步:
    (1)对象实例化:就是执行类中构造函数的内容,如果该类存在父类JVM会通过显示或者隐示的方式先执行父类的构造函数,在堆内存中为父类的实例变量开辟空间,并赋予默认的初始值,然后在根据构造函数的代码内容将真正的值赋予实例变量本身,然后,引用变量获取对象的首地址,通过操作对象来调用实例变量和方法 
    (2)垃圾收集:当对象不再被引用的时候,就会被虚拟机标上特别的垃圾记号,在堆中等待GC回收 
    (3)对象的终结:对象被GC回收后,对象就不再存在,对象的生命也就走到了尽头
5.类卸载 
    类卸载即类的生命周期走到了最后一步,程序中不再有该类的引用,该类也就会被JVM执行垃圾回收,从此生命结束…
最后看一下类加载的时候的初始化顺序:
    1、初始化父类的静态变量,静态代码块,初始化的顺序按照出现顺序。
    2、初始化子类的静态变量,静态代码块。
    3、初始化父类的成员变量。
    4、执行父类的构造函数。
    5、初始化子类的成员变量。
    6、构造代码块创建对象时执行。
    7、执行子类的构造函数。 
                    ![此图来自http://blog.csdn.net/mrzhoug/article/details/51581994,觉得很很清晰,分享给大家](https://img-blog.csdn.net/20180817082151470?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4MTAxODE0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值