构造器方法中指令按语句在源文件中出现的顺序执行 。
()不同于类的构造器 。(关联:构造器是虚拟机视角下的())
若该类具有父类,WM会保证子类的()执行前,父类的()已经执行完毕 。
虚拟机必须保证一个类的()方法在多线程下被同步加锁 。
package com.lxg.java;/*** @author shkstart* @create 2020 上午 11:23*/public class DeadThreadTest {public static void main(String[] args) {Runnable r = () -> {System.out.println(Thread.currentThread().getName() + "开始");DeadThread dead = new DeadThread();System.out.println(Thread.currentThread().getName() + "结束");};Thread t1 = new Thread(r,"线程1");Thread t2 = new Thread(r,"线程2");t1.start();t2.start();}}class DeadThread{static{if(true){System.out.println(Thread.currentThread().getName() + "初始化当前类");while(true){}}}}
只会初始化一次,并且谁抢到了就会加锁
package com.lxg.java;/*** @author shkstart* @create 2020 下午 6:01*/public class ClassInitTest {private static int num = 1;static{num = 2;number = 20;System.out.println(num);//System.out.println(number);//报错:非法的前向引用 。}private static int number = 10;//linking之prepare: number = 0 --> initial: 20 --> 10public static void main(String[] args) {System.out.println(ClassInitTest.num);//2System.out.println(ClassInitTest.number);//10}}
在类加载的过程中,首先会执行静态成员变量的初始化,包括静态变量和静态代码块 。因此,在这段代码中,int= 10;会先被执行,其值会被赋为0 。然后,静态代码块会被执行,将num的值赋为2,的值赋为20 。最后,的值又被赋为10,这是因为在类加载的阶段,被赋为默认值0,而在阶段,又被重新赋值为20,最终又被赋值为10 。因此,静态成员变量的初始化顺序是先执行静态变量的初始化,再执行静态代码块的内容 。
Java非法向前引用变量_指尖凉的博客-CSDN博客
如果字段会进行初始化,一定要防止在初始化前程序中访问默认值(可以赋值但不可访问),这会导致很多意想不到的麻烦
静态代码的执行顺序:
【一、JVM和Java体系结构】静态代码块的执行顺序是在类被加载时执行,且只会执行一次 。具体的执行顺序如下:1. 先执行父类的静态代码块,再执行子类的静态代码块 。2. 静态代码块的执行顺序与它们在类中出现的顺序有关,按照代码顺序依次执行 。3. 静态变量的初始化也是在静态代码块中进行的,因此静态变量的初始化顺序也与静态代码块的执行顺序有关 。总之,静态代码块的执行顺序是在类加载时执行,按照代码顺序依次执行,且只会执行一次 。
这里给出一个完整的例子,包括类的加载、初始化和静态变量的初始化等过程:
public class StaticBlockExample {static {System.out.println("StaticBlockExample静态代码块1");}public static int staticVar = 1;static {System.out.println("StaticBlockExample静态代码块2");}public static void main(String[] args) {System.out.println("StaticBlockExample静态变量的值为:" + staticVar);}}class ChildStaticBlockExample extends StaticBlockExample {static {System.out.println("ChildStaticBlockExample静态代码块1");}public static int childStaticVar = 2;static {System.out.println("ChildStaticBlockExample静态代码块2");}}
输出结果为:
StaticBlockExample静态代码块1StaticBlockExample静态代码块2ChildStaticBlockExample静态代码块1ChildStaticBlockExample静态代码块2StaticBlockExample静态变量的值为:1
我们可以看到,在程序运行时,首先加载类,执行它的静态代码块,输出"静态代码块1"和"静态代码块2",然后初始化静态变量的值为1 。
- 梁文道:这是做读书节目以来,最想给观众介绍的一本书 中国十大禁书剪灯夜话
- 世界级都市排行榜:纽约、洛杉矶领衔,上海、北京崭露头角 世界十大地标建筑
- 世界上最高的两座电视塔,一座在日本,一座在中国,你说哪座好看 世界十大电视塔
- 国内排不上名的大学,被美国制裁后,一举成为世界名校 中国十大名气下降大学
- 行业第一!八马茶业登顶2023中国顾客满意度指数榜首 中国十大茶叶连锁店
- 盘点身价过亿的10位女明星:一个比一个有钱,你知道几个? 中国最富的十大女明星
- 马云被四部门联合约谈 双十一红包每天三次怎么领
- 近期超火的5款免费APP,你都用过哪一款? 免费下载中国之最伴奏
- 忻州长城:四项全国第一、十项全国唯一! 中国之最长城排名
- 它是中国西部第一条商业步行街,街上有这么一座地标,必须瞻仰 中国之最步行街