普通代码块:类里的代码块,方法里的代码块,语句代码块,{}

构造代码块:直接写在类里方法外的代码块,用来对实例对象进行初始化

静态代码块:语法上,在构造代码块前加一个static,用来对类进行初始化

同步代码块:使用synchronize关键字包裹起来的代码块,用于多线程

1. 构造代码块

{
    //代码块里的内容
}

public class ConstructorBlock {public static void main(String[] args) {Test t1 = new Test("ok");Test t2 = new Test(3.14);Test t3 = new Test();System.out.println(Test.getCount());}
}class Test {private String a;private int b;private String c;private double d;private static int count = 0;{/*无论调用哪个构造方法都会执行的代码,可以放在构造代码块里构造代码对 实例对象进行统一的初始化*/System.out.println("创建对象了!!!!");count++;/*a = "hello";b = 10;*/}public Test() {}    public Test(String c) {System.out.println("调用了String c构造方法");this.c = c;}public Test(double d) {System.out.println("调用了 double d构造方法");this.d = d;}public static int getCount() {return count;}
}

2. 静态代码块

对类进行统一的初始化,类会先于实例对象加载,类只会被加载一次

静态的(方法、静态内部类、静态代码块),只能调用静态的,不能调用非静态的,原因就是类先于对象加载!

语法结构:

【修饰符】 class 类名{
            static{
                静态代码块语句;
            }
}

public class StaticBlock {public static void main(String[] args) {Demo d1 = new Demo();Demo d2 = new Demo();Demo d3 = new Demo();}
}class Demo {private static int x = 10;private String y = "hello";static {System.out.println("我是静态代码块");}public void test() {}public static void demo() {System.out.println(x);}public Demo() {}public Demo(String y) {this.y = y;}
}

3. 类的初始化

类在什么情况下加载:

1. 使用类创建实例对象

2. 运行mian方法所在的类

3. 访问类里的静态属性  或者调用类里的静态方法

System.out.println(Test.x);

Test.test();

4. 子类在加载之前,先初始化父类

Son s = new Son();

如果访问一个类里的静态常量,这个类不会被加载

类只会被加载一次

类的加载顺序:

1.类里的静态成员变量设置默认值,静态成员常量指定值

2.初始化父类

2.1 父类里的静态成员变量设置默认值,静态成员常量指定值

2.2 初始化父类

2.3 给 父类的静态成员变量赋值以及执行静态代码块

3. 给静态成员变量赋值以及执行静态代码块(代码的书写顺序执行)

public class ClassInitialize {public static void main(String[] args) {Son s = new Son();}
}class Test {static {Son.printM();Son.printN();System.out.println("Test类被加载了");}static int x = 10;static final int a = 9;public static void test() {}
}class Son extends Test {static int m = 5;static {System.out.println("Son类被加载了");printM();}static final int n = 3;public static void printM() {System.out.println("son里的M = " + m);}public static void printN() {System.out.println("son里的n = " + n);}
}

结果:

son里的M = 0
son里的n = 3
Test类被加载了
Son类被加载了
son里的M = 5

执行顺序:

4. 对象的初始化

Sub类型的对象s 初始化过程:

1. 对象里成员变量设置默认值

2. 执行构造方法里的super() 或者 this()  初始化父类空间

2.1. 父类空间里成员变量设置默认值

2.2. 执行父类构造方法里的super() 或者 this()  初始化父类空间

2.3. 给父类空间成员变量赋值以及执行构造代码块(按照代码的书写顺序执行)

2.4. 执行父类构造方法里的其他代码

3. 给成员变量赋值以及执行构造代码块(按照代码的书写顺序执行)

4. 执行构造方法里的其他代码

public class ObjectInitialize {public static void main(String[] args) {Sub s = new Sub();}
}class Base {private String x;private int a = 1;{System.out.println("Base的构造代码块执行了");}public Base() {System.out.println("Base.Base()");}public Base(String x) {this.x = x;System.out.println("Base.Base(String x)");}public Base(int a) {this.a = a;System.out.println("Base.Base(int a)");}public Base(String x, int a) {this.x = x;this.a = a;System.out.println("Base.Base(String x,int a)");}
}class Sub extends Base {private int t = 5;    {System.out.println("Sub的构造代码块执行了");}public Sub(int t) {System.out.println("Sub.Sub(int t)");this.t = t;}public Sub() {super("ok");System.out.println("Sub.Sub()");}
}

5. 类和对象初始化

一、初始化类

1.给静态成员变量设置默认值

2.初始化父类

2.1 给父类的静态成员变量设置默认值

2.2 初始化父类的父类

2.3 父类的静态成员变量赋值以及执行静态代码块(按照代码的书写顺序执行)

3.给静态成员变量赋值以及执行静态代码块(按照代码的书写顺序执行)

类只会被初始化一次

二、 初始化实例对象

1、给非静态成员变量设置默认值

2、调用构造方法里super()或者this() 初始化父类的父类空间

2.1 给父类非静态成员变量设置默认值

2.2 调用构造方法里super()或者this() 初始化父类的父类空间

2.3 给父类成员变量赋值以及执行构造代码块(按照代码的书写顺序执行)

2.4 执行父类构造方法里的其他代码

3、给成员变量赋值以及执行构造代码块(按照代码的书写顺序执行)

4、执行构造方法里的其他代码

public class InitializeDemo {public static void main(String[] args) {Demo d1 = new Demo();  // 既会初始化类,也会初始化对象System.out.println("-----------------------");Demo d2 = new Demo();}
}class Super {private static int x = 10;static {System.out.println("Super的静态代码块执行了");printXY();Demo.printMN();}private static int y = 5;private int a = 10;{System.out.println("Super的构造代码块");printAB();}private int b = 3;public static void printXY() {System.out.println("Super静态方法里的 x = " + x + ",y = " + y);}public void printAB() {System.out.println("Super非静态方法里的 a = " + a + ",b = " + b);}
}class Demo extends Super {private static int m = 10;//空参构造可以省略public Demo(){super();}static {System.out.println("Demo的静态代码块执行了");printMN();}private static int n = 5;private int s = 10;{System.out.println("Demo的构造代码块");printAB();super.printAB();}private int p = 3;public static void printMN() {System.out.println("Demo静态方法里的 m = " + m + ",n = " + n);}public void printAB() {System.out.println("Demo非静态方法里的 s = " + s + ",p = " + p);}
}

结果:

Super的静态代码块执行了
Super静态方法里的 x = 10,y = 0
Demo静态方法里的 m = 0,n = 0
Demo的静态代码块执行了
Demo静态方法里的 m = 10,n = 0
Super的构造代码块
Demo非静态方法里的 s = 0,p = 0
Demo的构造代码块
Demo非静态方法里的 s = 10,p = 0
Super非静态方法里的 a = 10,b = 3
-----------------------
Super的构造代码块
Demo非静态方法里的 s = 0,p = 0
Demo的构造代码块
Demo非静态方法里的 s = 10,p = 0
Super非静态方法里的 a = 10,b = 3

执行顺序:

代码块(普通代码块、构造代码块、静态代码块、同步代码块)、初始化(类初始化、对象初始化)相关推荐

  1. [转载] java synchronized静态同步方法与非静态同步方法,同步语句块

    参考链接: Java中的静态方法与实例方法 java synchronized静态同步方法与非静态同步方法,同步语句块 并发编程 线程同步 静态方法锁 非静态方法锁 同步块 进行多线程编程,同步控制是 ...

  2. java synchronized静态同步方法与非静态同步方法,同步语句块

    大纲:java线程知识体系 对代码进行同步控制我们可以选择同步方法,也可以选择同步块,这两种方式各有优缺点.同步块不仅可以更加精确的控制对象锁,还可以控制锁的作用域,何谓锁的作用域?锁的作用域就是从锁 ...

  3. java同步方法同步块_java 同步代码块与同步方法

    同步代码块 synchronized(obj) {//代码块 } obj 为同步监视器,以上代码的含义为:线程开始执行同步代码块(中的代码)之前,必须先获得对同步监视器的锁定. 代码块中的代码是执行代 ...

  4. repo同步代码_工欲善其事,必先利其器:repo 介绍

    介绍 此repo非彼repo.这里的repo,是指谷歌公司的一款小工具,名字就叫repo(我承认,这不是一个好名字,Google里面怎么搜都搜不到它的真身). 解决的问题 有时候,我们需要在一台电脑上 ...

  5. [4G5G专题-36]:物理层-同步信号块SSB与小区主同步PSS、小区辅同步SSS

    目录 第1章 同步信号块SSB概述 1.1 与同步信号块SSB相关的无线时频资源 1.2 同步信号块SSB概述 1.3 同步信号块SSB的来源和背景 1.4 理解本文的的所需要的前序知识 第2章 5G ...

  6. 牛客网Java刷题知识点之什么是代码块、普通代码块、静态代码块、同步代码块、构造代码块以及执行顺序...

    不多说,直接上干货! 这种形式的程序段我们将其称之为代码块,所谓代码块就是用大括号({})将多行代码封装在一起,形成一个独立的数据体,用于实现特定的算法.一般来说代码块是不能单独运行的,它必须要有运行 ...

  7. 【JAVA类与对象----5(static、代码块)】

    一.为什么使用static class Student{private String name; //姓名private int age; //年龄private String classroom; ...

  8. java 代码块(局部代码块、实例代码块、静态代码块、同步代码块)

    1 引言 代码块是类的成分之一:成员变量,方法,构造器,代码块,内部类. 在Java中,使用 { } 括起来的代码被称为代码块(Code block) 1.1 代码块的分类 根据其位置和声明的不同,可 ...

  9. 同步方法和同步代码块

    2019独角兽企业重金招聘Python工程师标准>>> 打个比方:一个object就像一个大房子,大门永远打开.房子里有很多房间(也就是方法).这些房间有上锁的(synchroniz ...

最新文章

  1. 【怎样写代码】工厂三兄弟之抽象工厂模式(四):抽象工厂模式
  2. 关于.net实现网站模板机制(非标签替换)
  3. 《LeetCode力扣练习》第46题 全排列 Java
  4. 【笔记】虚拟机用Xshell登陆报错“ssh服务器拒绝了密码”解决方法
  5. GRE作文用AI打分,已经20周年了:AI给中国考生的分数,远高于人类打分
  6. 获香港证监会颁发牌照的弘量研究,正用智能投顾帮助金融机构降低成本,提升资产管理能力 By 藤子2017年10月09日 17:16 撰文 | 藤子 2015 年,雷春然和黄耀东都是在香港科技大学的
  7. 框架:Spring Aop、拦截器、过滤器的区别
  8. JS(ES6)、Vue.js、node.js
  9. ZENG msgbox仿qq提示
  10. 介绍几种不同的标志符号 CMC CPA CPE CMA
  11. 信息技术专项习题汇总
  12. arduino i2c EEPROM(AT24C02、AT24C08、AT24C16、AT24C32、AT24C64)驱动
  13. Android 属性动画
  14. Spring的装配方式
  15. Vue3源码解析04--响应式核心effect
  16. 【CANoe】车载网络的相关概述
  17. 鲁大师发布2022半年报手机UI排行榜,vivo OriginOS成为最流畅UI
  18. 空间任一点到超平面的距离公式的推导过程
  19. lamp-linux2
  20. (已解决)EOFError: Ran out of input

热门文章

  1. 校园服务器虚拟机规划与设计,校园网办公楼网络规划与设计1.pdf
  2. linux建分区以cylinder,Linux添加新硬盘,fdisk新建分区
  3. 手写数组的api:some,map,every
  4. 计算机毕业论文如何设计创新点--必看攻略!!!
  5. android-Google Support Library及Android源码 兼容包下载
  6. day01 C语言基础
  7. java getdc_GetWindowDC-BeginPaint-GetDC 区别详解
  8. python线条加粗_python 加粗
  9. Pygame游戏之 豌豆射手
  10. VBScript脚本自动发信息