前言:
在java中,用{}括起来的称为代码块,代码块可分为以下四种:
普通代码块、构造代码块、静态代码块、同步代码块。
一、定义
1. 普通代码块(不需要讨论,太常见了)
类中的方法的方法体。(就是{}和它里面的整体称为普通代码块。)
如:
public class Student(){
public void getMoney(){
System.out.println("你好");
}
}
2. 构造代码块
类中的用 {} 括起来的代码片段,{}外面没有修饰。
构造代码块只在创建对象时被调用,每次创建时都会被调用,优先于构造方法执行。
如:
public class Student(){
{
System.out.println("你好1");
}
}
3. 静态代码块
类中的用 static{} 括起来的代码片段。
静态代码块,随着类的加载而执行,而且只执行一次。
静态代码块优先于构造方法执行。
静态代码块等同于静态变量 执行级别。
注意:
1.静态代码块不能存在于任何方法体中。
2.静态代码块不能直接访问实例变量和实例方法,需要通过类的实例对象来访问。
3.静态代码块,不能初始化非静态变量(实例变量)。
4.如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"。
如:
public class Student(){
private static String name;
private static String sex;
static{
name="张三姓名";
sex="女性别";
}
}
4. 同步代码块
类中的用 synchronized(锁对象){} 括起来的代码片段。
(同步代码块需要写在方法中。)
如:
public class Student(){
Demo obj=new Demo();
public void test1(){
synchronized(obj){
//需要被同步的代码块
}
}
}
5. 构造方法
构造方法分为无参构造方法 和 有参构造方法。(这儿不介绍了,下面内容只解释执行顺序)
6. main方法
略。(这儿不介绍了,下面内容只解释执行顺序)
二、区别
1. 构造代码块和静态代码块的区别:
-
相同点:
都是在JVM的类加载器加载 类的.class字节码 后,且在构造方法执行之前执行;
都可在类中定义多个,一般在代码块中对一些static变量进行赋值。 -
不同点:
(执行顺序):静态代码块在构造代码块之前执行。
(执行次数):静态代码块只在JVM类加载器加载类后,执行一次,之后不在执行;而构造代码块每new创建一次对象就执行一次,而且在构造方法前执行。
三、示例
1. 示例一(没有继承关系的)
输出结果:
2. 示例二(有继承关系的)
父类:
子类:
输出结果:
3. 示例三(有继承关系的)
父类:
子类:
输出结果:
四、阿里巴巴面试题
如下:
输出结果:
总结:静态声明缘故,t1、t2等静态变量也和静态块处于同一优先级。
五、学习链接
链接1:https://blog.csdn.net/qq_35868412/article/details/89360250
链接2:https://blog.csdn.net/harryptter/article/details/87875399#笔试题
链接3:https://www.cnblogs.com/Heliner/p/10524699.html