广东网站建设968,长沙公司网站设计报价,dede我的网站,大图网 网站文章目录代码块的分类1、静态代码块#xff08;也叫静态块、静态初始化块#xff09;2、构造代码块#xff08;也叫构造初始化块#xff09;3、代码块#xff08;又叫普通代码块、初始化块#xff09;执行顺序的代码测试继承中各代码块的执行顺序前言 在Java中#xff0…
文章目录代码块的分类1、静态代码块也叫静态块、静态初始化块2、构造代码块也叫构造初始化块3、代码块又叫普通代码块、初始化块执行顺序的代码测试继承中各代码块的执行顺序前言 在Java中Static静态代码块、构造代码块、普通代码块、构造函数的执行顺序是一个java学习者必须掌握的基础本篇博客旨在让大家能清除了解它们之间的执行顺序。
代码块的分类
基本上代码块分为三种Static静态代码块、构造代码块、普通代码块
代码块执行顺序静态代码块—— 构造代码块 —— 构造函数—— 普通代码块
继承中代码块执行顺序父类静态块——子类静态块——父类代码块——父类构造器——子类代码块——子类构造器
1、静态代码块也叫静态块、静态初始化块
Java静态代码块中的代码会在类加载JVM时运行且只被执行一次也就是说这些代码不需要实例化类就能够被调用。一般情况下,如果有些代码必须在项目启动的时候就执行的时候,就需要使用静态代码块所以静态块常用来执行类属性的初始化
关于Static静态代码块的五个小结点 1、Java静态代码块中的代码会在类加载JVM时运行且只被执行一次 2、静态块常用来执行类属性的初始化 3、静态块优先于各种代码块以及构造函数如果一个类中有多个静态代码块会按照书写顺序依次执行 4、静态代码块可以定义在类的任何地方中除了方法体中【这里的方法体是任何方法体】 5、静态代码块不能访问普通变量 针对4中描述静态代码块不能存在任何方法体中的原因其实也是很简单由于普通方法是通过加载类然后new出实例化对象通过对象才能运行这个方法而静态代码块只需要加载类之后就能运行了。对于静态方法在类加载的时候静态方法也已经加载了但是我们必须要通过类名或者对象名才能访问也就是说相比于静态代码块静态代码块是自己主动运行的而静态方法是被动调用运行的。不管是哪种方法我们需要明确静态代码块的存在在类加载的时候就自动运行了而放在不管是普通方法还是静态方法中都是不能自动运行的。
针对5中描述静态代码块不能访问普通变量原因同样简单。普通变量是被实例对象调用的静态代码块中都不存在其实例对象谈何调用变量
Static静态代码块使用格式
static{..............
}
1232、构造代码块也叫构造初始化块
听这名字就知道和构造方法离不开没错但是还是和构造方法有着本质区别我们都知道没个方法中都可以有很多构造方法每创建一个对象其构造方法就执行一个而一个构造方法可以创建N个对象构造方法就比较“高冷”了而构造代码块就比较“舔狗”了只要该类实例了一个对象构造代码就执行一次利用每次创建对象的时候都会提前调用一次构造代码块特性所以它可以做统计创建对象的次数功能。当然构造代码块用的相对少
构造代码块小结 1、构造代码块在创建对象时被调用每次创建对象都会调用一次 2、构造代码块优先于构造函数执行同时构造代码块的运行依赖于构造函数 3、构造代码块在类中定义 针对2中的“依赖”可理解为如果不实例化对象也就是不执行构造方法构造代码块是不会执行的
3、代码块又叫普通代码块、初始化块
代码块小结 1、普通代码块定义在方法体中 2、普通代码块与构造代码块的格式一致都是{} 3、普通代码块与构造代码块唯一能直接看出的区别是构造代码块是在类中定义的而普通代码块是在方法体中定义的 执行顺序的代码测试
以上已经讲得差不多了开始上代码了
package com.gx.initializationblock;public class Initializationblock {int intA;int intB;public Initializationblock() {System.out.println(无参构造器00000000);}public Initializationblock(int a) {System.out.println(一个参数的构造器);}{intA 10;intB 15;System.out.println(构造初始化块11111);}{System.out.println(构造初始化块22222);}{System.out.println(构造初始化块33333);}//静态初始化块static {System.out.println(静态初始化块01010101);}static {System.out.println(静态初始化块0202020202);}public void method(){{System.out.println(普通初始化块);}}
}测试demo
package com.gx.initializationblock;/* 初始化块一* 因为静态块是在类的初始化阶段完成的* 因此在创建某个类的第二个对象时该类的静态块就不会执行了* * 在单个类中静态初始化块初始化块构造器* 多个类的继承中初始化块、静态初始化块、构造器的执行顺序
在继承中先后执行父类A的静态块父类B的静态块最后子类的静态块然后再执行父类A的非静态块和构造器然后是B类的非静态块和构造器最后执行子类的非静态块和构造器*/
public class Demo1 {public static void main(String[] args) {Initializationblock initializationblock new Initializationblock();initializationblock.method();System.out.println(------------);//多打印几个对象的目的是好看出Static静态代码块只执行一次Initializationblock initializationblock2 new Initializationblock(); //因为静态块是在类的初始化阶段完成的因此在创建某个类的第二个对象时该类的静态块就不会执行了initializationblock2.method();Initializationblock initializationblock3 new Initializationblock();initializationblock3.method();}
}打印结果
静态初始化块01010101
静态初始化块0202020202
构造初始化块11111
构造初始化块22222
构造初始化块33333
无参构造器00000000
普通初始化块
------------
构造初始化块11111
构造初始化块22222
构造初始化块33333
无参构造器00000000
普通初始化块
构造初始化块11111
构造初始化块22222
构造初始化块33333
无参构造器00000000
普通初始化块得出结论执行顺序静态代码块 构造代码块 构造函数 普通代码块
继承中各代码块的执行顺序
啥都不说了直接撸代码继承关系为 BaseThree—— BaseTwo—— BaseOne BaseOne类
package com.gx.initializationblock;public class BaseOne {public BaseOne() {System.out.println(BaseOne构造器);}{System.out.println(BaseOne初始化块);System.out.println();}static {System.out.println(BaseOne静态初始化块);}}BaseTwo类
package com.gx.initializationblock;public class BaseTwo extends BaseOne {public BaseTwo() {System.out.println(BaseTwo构造器);}{System.out.println(BaseTwo初始化块);}static {System.out.println(BaseTwo静态初始化块);}
}BaseThree 类
package com.gx.initializationblock;public class BaseThree extends BaseTwo {public BaseThree() {System.out.println(BaseThree构造器);}{System.out.println(BaseThree初始化块);}static {System.out.println(BaseThree静态初始化块);}
}测试demo2类
package com.gx.initializationblock;/*注这里的ABC对应BaseOne、BaseTwo、BaseThree * 多个类的继承中初始化块、静态初始化块、构造器的执行顺序在继承中先后执行父类A的静态块父类B的静态块最后子类的静态块然后再执行父类A的非静态块和构造器然后是B类的非静态块和构造器最后执行子类的非静态块和构造器*/
public class Demo2 {public static void main(String[] args) {BaseThree baseThree new BaseThree();System.out.println(-----);BaseThree baseThree2 new BaseThree();}
}运行结果
BaseOne静态初始化块
BaseTwo静态初始化块
BaseThree静态初始化块
BaseOne初始化块BaseOne构造器
BaseTwo初始化块
BaseTwo构造器
BaseThree初始化块
BaseThree构造器
-----
BaseOne初始化块BaseOne构造器
BaseTwo初始化块
BaseTwo构造器
BaseThree初始化块
BaseThree构造器多个类的继承中初始化块、静态初始化块、构造器的执行顺序为先后执行父类A的静态块父类B的静态块最后子类的静态块然后再执行父类A的非静态块和构造器然后是B类的非静态块和构造器最后执行子类的非静态块和构造器【注这里的ABC对应BaseOne、BaseTwo、BaseThree 】
结论多个类的继承中初始化块、静态初始化块、构造器的执行顺序为父类静态块——子类静态块——父类代码块——父类构造器——子类代码块——子类构造器