本文共 1009 字,大约阅读时间需要 3 分钟。
先给出代码,大家可以先思考一下将会打印什么内容:
public class StaticTest { public static void main(String[] args) { staticFunction(); System.out.println("main中b:"+b); } static StaticTest staticTest=new StaticTest(); static { System.out.println(1); } { System.out.println(2); } StaticTest(){ System.out.println(3); System.out.println("a="+a+"b="+b); } private static void staticFunction() { System.out.println(4); } int a=100; static int b=200;}
思考…
思考… 时间到,结果为: 有没有出乎大家的意料呢.代码中从头到尾依次是
main方法 静态成员变量 静态代码块 非静态代码块 (创建一个对象的时候就调用一次非静态代码块,执行顺序在构造器之前) 构造器 私有静态成员方法 成员变量 静态变量static修饰的属性从上到下依次赋值,虽然main方法也是static修饰,但是main方法比较特殊,会在最后执行,因此先放一边.
(参考博客:) 为了赋值给 staticTest,需要先创建StaticTest对象,调用构造器之前会先调用非静态代码块 (创建一个对象的时候就调用一次非静态代码块,执行顺序在构造器之前),第一次打印,打印2.随后调用构造器,第二次打印,打印3,接着执行System.out.println(“a=”+a+“b=”+b)语句,成员变量a已在创建过程完成了赋值,而静态变量b虽然已经在堆中开辟了内存空间,但是因为位置在最后一个static还没有进行赋值,此时仍为初始值0,所以第三次打印,打印a=100b=0.
完成赋值,执行静态代码块,第四次打印,打印1. 接着给静态变量b赋值为200,最后开始执行main方法,调用了私有静态方法staticFunction,第五次打印,打印4.最后第六次打印,打印main中b:200.我的另一篇文章 构造器和成员变量默认赋值的执行顺序
转载地址:http://vczfb.baihongyu.com/