1. 静态代码块

静态代码块:定义在类中方法外,使用static修饰

①可以为类变量(静态变量)初始化

②静态代码块在第一次使用这个类之前执行,即在类初始化时执行,且只执行一次

③若有多个静态代码块,那么按照定义的先后顺序依次执行

④在静态代码块中不能访问非静态成员(属性、方法、内部类)

⑤在静态代码块中不能使用this和super关键字

⑥静态代码块的执行优先于main方法、非静态代码块和构造方法的执行

⑦父类静态代码块的执行优先于子类静态代码块执行

代码示例:

public class StaticBlockTest {

public static void main(String[] args) {

MyClass.show();

MyClass.show();

MyClass.show();

}

static {

System.out.println("StaticBlockTest类静态代码块");

}

}

class MyClass {

static {

System.out.println("MyClass类静态代码块1");

}

public static void show() {

System.out.println("MyClass类静态方法");

}

static {

System.out.println("MyClass类静态代码块2");

}

}

运行结果:

StaticBlockTest类静态代码块

MyClass类静态代码块1

MyClass类静态代码块2

MyClass类静态方法

MyClass类静态方法

MyClass类静态方法

2. 类初始化

类初始化即执行类初始化方法:()

类初始化方法,一个类只有一个。它也是由编译器编译生成的,由两部分代码组成:

①静态变量的显式赋值代码

②静态代码块的代码

其中①和②是按定义的先后顺序依次执行的

代码示例:

public class InitTest {

public static void main(String[] args) {

MyClass my = new MyClass();

}

}

class MyClass {

static {

System.out.println("MyClass类静态代码块1");

}

private static String str = assingn();

public static void show() {

System.out.println("MyClass类静态方法");

}

private static String assingn() {

System.out.println("assign()方法为静态变量显式赋值");

return "java";

}

static {

System.out.println("MyClass类静态代码块2");

}

}

运行结果:

MyClass类静态代码块1

assign()方法为静态变量显式赋值

MyClass类静态代码块2

3. 子类初始化

一个类初始化时会先检查它的父类是否初始化,如果父类没有初始化,那么会先初始化父类

(1)父类的初始化()

父类的静态变量的显式赋值

父类的静态代码块

(2)子类的初始化()

父类的静态变量的显式赋值

父类的静态代码块

代码示例:

public class InitTest2 {

public static void main(String[] args) {

/*Father f = new Father();

System.out.println("--------分隔线---------");*/

Son s = new Son();

}

}

class Father{

private static String info = assign();

static{

System.out.println("父类的静态代码块");

}

//静态方法不能被重写

public static String assign(){

System.out.println("父类assign()方法");

return "Father";

}

}

class Son extends Father{

private static String info = assign();

static{

System.out.println("子类的静态代码块");

}

public static String assign(){

System.out.println("子类assign()方法");

return "Son";

}

}

运行结果:

父类assign()方法

父类的静态代码块

子类assign()方法

子类的静态代码块

4. 类初始化和实例初始化结合

先执行类初始化,后执行实例初始化

代码示例:

public class InitTest3 {

public static void main(String[] args) {

Demo d = new Demo();

}

}

class Demo{

{

System.out.println("非静态代码块1");

}

static{

System.out.println("静态代码块1");

}

public Demo(){

System.out.println("无参构造");

}

private static String info = assignInfo();

private String msg = assignMsg();

static{

System.out.println("静态代码块2");

}

{

System.out.println("非静态代码块2");

}

public static String assignInfo(){

System.out.println("assignInfo()方法");

return "hello";

}

public String assignMsg(){

System.out.println("assignMsg()方法");

return "msg";

}

}

运行结果:

静态代码块1

assignInfo()方法

静态代码块2

非静态代码块1

assignMsg()方法

非静态代码块2

无参构造

5. 子类初始化和子类实例初始化结合

执行顺序:①父类的类初始化 => ②子类的类初始化 => ③父类的实例初始化方法 => ④子类的实例初始化方法

public class InitTest4 {

public static void main(String[] args) {

//Father f = new Father();

Son s = new Son();

}

}

class Father {

{

System.out.println("父类非静态代码块1");

}

static {

System.out.println("父类静态代码块1");

}

private static String info = assignInfo();

private String msg = assignMsg();

public Father() {

System.out.println("父类无参构造");

}

static {

System.out.println("父类静态代码块2");

}

{

System.out.println("父类非静态代码块2");

}

public static String assignInfo() {

System.out.println("父类assignInfo()方法");

return "hello";

}

public String assignMsg() {

System.out.println("父类assignMsg()方法");

return "msg";

}

}

class Son extends Father {

{

System.out.println("子类非静态代码块1");

}

static {

System.out.println("子类静态代码块1");

}

private static String info = assignInfo();

private String msg = assignMsg();

public Son() {

System.out.println("子类无参构造");

}

static {

System.out.println("子类静态代码块2");

}

{

System.out.println("子类非静态代码块2");

}

public static String assignInfo() {

System.out.println("子类assignInfo()方法");

return "hello";

}

public String assignMsg() {

System.out.println("子类assignMsg()方法");

return "msg";

}

}

父类静态代码块1

父类assignInfo()方法

父类静态代码块2

子类静态代码块1

子类assignInfo()方法

子类静态代码块2

父类非静态代码块1

子类assignMsg()方法

父类非静态代码块2

父类无参构造

子类非静态代码块1

子类assignMsg()方法

子类非静态代码块2

子类无参构造

java类静态初始化_Java静态代码块和类初始化、实例初始化过程相关推荐

  1. java同步方法完成案例_Java同步代码块和同步方法原理与应用案例详解

    本文实例讲述了java同步代码块和同步方法.分享给大家供大家参考,具体如下: 一 点睛 所谓原子性WOmoad:一段代码要么执行,要么不执行,不存在执行一部分被中断的情况.言外之意是这段代码就像原子一 ...

  2. [转载] Java中静态成员变量,静态代码块,静态内部类何时被初始化?

    参考链接: Java中的初始化程序块Initializer Block 关于这个问题,本文不扯理论,直接上代码,通过结果来验证结论,废话少说,测试代码如下: public class StaticTe ...

  3. java中静态变量,静态代码块,静态方法,实例变量,匿名代码块的加载顺序

    1. java中静态变量,静态代码块,静态方法,实例变量,匿名代码块 在Java中,使用{}括起来的代码称为代码块,代码块可以分为以下四种: (1)普通代码块:就是类中方法的方法体 public vo ...

  4. java静态代码块、静态方法、静态变量、构造代码块、普通代码块、成员变量执行顺序

    package smartt.styy.auth.model.voRsp;public class Test {static {String test5="555";//局部变量t ...

  5. java 同步块原理_Java同步代码块和同步方法原理与应用案例详解

    Java同步代码块和同步方法原理与应用案例详解 发布于 2020-8-7| 复制链接 摘记: 本文实例讲述了Java同步代码块和同步方法.分享给大家供大家参考,具体如下:一 点睛所谓原子性:一段代码要 ...

  6. Java基础篇:四种代码块详解

    所谓代码块,就是用大括号{}将多行代码封装在一起,形成一个独立的数据体,用于实现特定的算法.一般来说,代码块是不能单独运行的,它必须有运行主体.在Java中代码块主要分为四种:普通代码块.静态代码块. ...

  7. Java核心(三):代码块的作用

    Java中用{ }括起来的代码段就是代码块,他分为如下几种类型 位置 作用 局部代码块 在方法当中使用,作用是控制变量的生命周期. 局部代码块的变量,只能在代码块内部使用,在执行结束后会被Java回收 ...

  8. Java里面static, final, this, super, 代码块, 单例模式

    static关键字 package csdn;public class staticWord {public static void main(String[] args) {funStatic fs ...

  9. Java的static,final,代码块,内部类,抽象类,接口等

    Java的static,final,代码块,内部类,抽象类,接口等 1 static关键字月final关键字 1.1 static static表示静态.可以修饰属性,方法,代码块内部类等,总结如下: ...

最新文章

  1. TD321DCAN 隔离CAN总线驱动器
  2. 解惑(二)----- 如何通俗地理解Python中的if __name__ == ‘__main__‘
  3. IDEA中Spring MVC实现图片上传并显示
  4. java兔子问题编程思路详解_Java算法之“兔子问题”
  5. 用sum函数求三个数和C语言,C语言用函数写两数之和.doc
  6. Project Chameleon Work In Progress 12
  7. STM32之定时器中断控制LED闪烁
  8. 我为什么放弃了 Chrome?
  9. python 用 __all__ 暴露接口
  10. Linux系统修改编码(转)
  11. android5.1蓝牙opp协议去掉Notification和Dialog操作提示
  12. qtvs添加qchart_如何使用Qt Designer在表单中插入QChartView?
  13. 数组字符串转int数组_7.5 C++字符串数组 | 字符串数组输出
  14. 解决Echarts官网无法访问的问题
  15. Linux(二、三、四)简单命令、系统目录结构、文件类型、命令行管理文件学习
  16. Freenom申请免费域名
  17. paper reading: Rob-GAN: Generator, Discriminator, and Adversarial Attacker
  18. 汇川机器人视觉定位通讯程序
  19. 排球分组循环交叉编排_学校2020年教职工气排球比赛圆满落幕
  20. 几何分布的概率和期望

热门文章

  1. 大数据分析平台的功能
  2. 输出矩阵的左下半三角
  3. 2018年php框架,2018年的7个热门网站开发框架
  4. 连接设备不支持android,安卓手机不识别U盘、不能连接PC的处理方法
  5. 永恒python怎么用_毫无基础的人如何入门 Python ?Python入门教程拿走不谢啦!
  6. 1. C++基础知识学习及其深入理解(面向对象部分还没学) -- 课程1完成
  7. java8 多行字符串_JDK8字符串拼接的正确姿势
  8. Java连Mysql数据库
  9. MySQL忘记root密码--不重启mysqd重置root密码
  10. 介绍两个Ubuntu上的桌面小工具