看了一篇CSDN的帖子,整理了一下,并且MARK学习
package org.test;
public class Tester5 {
public static void main(String[] args){
aaa();
}
static Tester5 st=new Tester5();
static{
System.out.println("1");
}
{
System.out.println("2");
}
Tester5(){
System.out.println("3");
System.out.println("a="+a+" b="+b);
}
public static void aaa(){
System.out.println("4");
}
int a=110;
static int b=112;
}
这里的答案居然是
2
3
a=110 b=0
1
4
JAVA中赋值顺序
1.父类的静态变量赋值
2.自身的静态变量赋值
3.父类成员变量赋值
4.父类块赋值
5.父类构造器赋值
6.自身成员变量赋值
7.自身块赋值
8.自身构造器赋值
原因:JVM中类的装载机制和实例化机
看起来和上例有些矛盾,但仔细一看就知道是那里面的static变量st初始化引起的。使非静态变量加载插入到的静态变量加载中去了,导致后面的static还没加载完,非静态的就已经加载
另外类的生命周期是:加载->验证->准备->解析->初始化->使用->卸载,只有在准备阶段和初始化阶段才会涉及类变量的初始化和赋值,但final变量是特殊的,第一步加载阶段就处理完成了,如果把上例的静态变量b改成final,确实是第一步就执行了
package com.cy.mybatis.service;
public class Tester5 {
public static void main(String[] args){
aaa();
}
static Tester5 st=new Tester5();
static{
System.out.println("1");
}
{
System.out.println(b);
System.out.println("2");
}
Tester5(){
System.out.println("3");
System.out.println("a="+a+" b="+b);
}
public static void aaa(){
System.out.println("4");
}
int a=110;
final static int b=112;
}