静态代码块属于类,随着类加载,执行一次(用的多)
package com.itheima.d3_static_code;
public class StaticDemo1 {
public static String schoolName;
/**
* 静态代码块: 有static修饰,属于类,与类一起优先加载一次,自动触发
* 无论static代码块,在main方法上面或者下面,都是先执行static代码块,因为static是属于类,与类一起加载
* 静态代码块作用:可以用于初始化静态资源(给静态成员初始化值)
*/
static { // Java是先加载类,然后执行main方法
System.out.println("===============静态代码块被触发执行了========================");
// 在static代码块中给初始化值
schoolName = "黑马";
}
public static void main(String[] args) {
// 目标: 先理解静态代码块
System.out.println("============main方法执行===============");
System.out.println(schoolName);
}
static { // Java是先加载类,然后执行main方法
System.out.println("===============静态代码块第二次被触发执行了========================");
}
}
实例代码块属于对象,基本不用,每次创建对象都会执行一次实例代码块
package com.itheima.d3_static_code;
public class StaticDemo2 {
public StaticDemo2(){ // 本身是有无参构造器的,但是可以可以定义无参构造器的方法,来验证无参构造器是否被调用
System.out.println("================无参构造器被触发执行============="); // 一调用new StaticDemo2();无参构造器,就会执行下面的代码
}
// 定义一个实例成员 (可以理解为实例资源)
private String name; //
/**实例代码块也叫构造代码块,属于对象 实例代码块不属于类,不会和类一起跑
* 实例代码块:无static修饰,属于对象,每次构建对象时:都会触发一次执行
* 格式{}
* 在实例代码块中初始化实例资源
*/
{ // 实例代码块几乎不用
System.out.println("==========实例代码块被触发执行==========="); // 每次构造对象才被执行
// name = "张三"; // 这里等于是写死了,每次创建的对象的name都叫张三
}
public static void main(String[] args) {
// 目标:理解实例代码块(构造代码块)
StaticDemo2 s1 = new StaticDemo2(); // 调用了无参构造器创建对象,会先输出实例代码块,然后再执行无参构造器,因为实例代码块在创建对象时就被调用了
System.out.println(s1.name);
StaticDemo2 s2 = new StaticDemo2();
System.out.println(s2.name); // 都叫张三了,就等于写死了,意义不打,所以实例代码块基本不用
}
}