初始化以及初始化块(静态与非静态)【了解即可】
- -初始化块的作用是用于在类加载或者创建对象时,可以设置一些固定的初始化操作(初始化成员变量、执行其他类的加载)
- -静态初始化块只执行一次(类加载时),非静态初始化块每创建一个对象就执行一次
- -静态初始化块-->非静态初始化块-->构造器
-
// 总结:
-
// 构造器(全参、有参、无参)-->非静态代码块(代码块)-->静态代码块
-
// 静态初始化块,只会执行一次【类加载--加载其他库】
-
// 每创建一个对象,非静态初始化块都会执行一次
-
// 定义一个非静态初始化代码块,对象数据进行初始化值
/**
* @author Lantzrung
* @date 2022年7月22日
* @Description
*/
public class Test {
public static void main(String[] args) {
// 操作一:
// 添加了无参构造器、全参构造器和toString方法
// Person p = new Person();
// System.out.println(p);//Person [name=null, sex=null, age=0]
// 操作二:
// 加上了一个初始化块 添加了无参构造器、全参构造器和toString方法
// Person p = new Person();
// System.out.println(p);//Person [name=无名氏, sex=男, age=10]
// // 操作三:
// 加上了一个初始化块 并给对象赋值 添加了无参构造器、全参构造器和toString方法
// 这里就算不要初始化块还是会给输出对象数据
// Person p = new Person("zhang", "nan", 19);
// System.out.println(p);
// Person [name=zhang, sex=nan, age=19]
// 操作四:
// 加上了一个初始化块 并添加一个输出语句"初始化块执行" 并给对象赋值 添加了无参构造器、全参构造器和toString方法
// Person p = new Person("zhang", "nan", 19);
// System.out.println(p);
// 初始化块执行
// Person [name=zhang, sex=nan, age=19]
// 操作五:
// 加上了一个初始化块 并添加一个输出语句"初始化块执行" 并给对象赋值 添加了无参构造器、全参构造器和toString方法
// 并且分别给构造器添加上"全参构造器初始化块执行"和"无参构造器初始化块执行"
// 就算注释了全参构造器和初始化,无参构造器还是不会输出语句,因为没有对它进行调用
// 要是要实现无参构造器的调用还是需要不对对象进行赋值
// Person p = new Person("zhang", "nan", 19);
// System.out.println(p);
// 初始化块执行
// 全参构造器初始化块执行
// Person [name=null, sex=null, age=0]
// 操作六:
// 加上了一个初始化块 并添加一个输出语句"初始化块执行"
// 添加了无参构造器、全参构造器和toString方法
// 并且分别给构造器添加上"全参构造器初始化块执行"和"无参构造器初始化块执行"
// 没有给对象进行赋值
// Person p = new Person();
// System.out.println(p);
// 初始化块执行
// 无参构造器初始化块执行
// Person [name=无名氏, sex=男, age=10]
// 操作七:
// 加上了一个静态初始化块并加上输出语句"静态初始化块执行"
// 加上了一个非静态初始化块并添加一个输出语句"非静态初始化块执行"
// 添加了无参构造器、全参构造器和toString方法
// 并且分别给构造器添加上"全参构造器初始化块执行"和"无参构造器初始化块执行"
// Person p = new Person("zhang", "nan", 19);
// System.out.println(p);
// 静态初始化块执行
// 非静态代码块初始化块执行
// 全参构造器初始化块执行
// 总结:
// 构造器(全参、有参、无参)-->非静态代码块(代码块)-->静态代码块
// 静态初始化块,只会执行一次【类加载--加载其他库】
// 每创建一个对象,非静态初始化块都会执行一次
// 定义一个非静态初始化代码块,对象数据进行初始化值
}
}
/**
* @author Lantzrung
* @date 2022年7月21日
* @Description
*/
public class Person {
public String name ;
public String sex;
public int age;
//定义一个静态变量
public static int item;
//静态初始化块,只会执行一次【类加载】
static {
//赋值给变量
item = 15;
System.out.println("静态初始化块执行");
}
// 每创建一个对象,非静态初始化块都会执行一次
// 定义一个非静态初始化代码块,对象数据进行初始化值
{
name = "无名氏";
sex = "男";
age = 10;
System.out.println("初始化块执行");
}
//操作二:定义初始化块,对对象数据进行初始化约定
public Person(String name, String sex, int age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
System.out.println("全参构造器初始化块执行");
}
public Person() {
super();
System.out.println("无参构造器初始化块执行");
}
@Override
public String toString() {
return "Person [name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
}
增加一个细节:
/**
* @author Lantzrung
* @date 2022年7月21日
* @Description
*/
public class Person {
//定义一个静态变量
//静态初始化块,只会执行一次【类加载】
public static int item = 20;//静态变量
public final static int item2 = 10;//静态常量 注意:颜色比常量变得更深一点
static {
//赋值给变量
item = 15;
System.out.println("静态初始化块执行");
}
}
/**
* @author Lantzrung
* @date 2022年7月22日
* @Description
*/
public class Test01 {
public static void main(String[] args) {
// 操作一:
// 静态变量在静态代码块前的时候,输出的是静态代码块中的变量数据
// Person p = new Person();
// System.out.println(p.item);//15
// 操作二:
// 静态变量在静态代码块后的时候,输出的是静态变量的数据
Person p = new Person();
System.out.println(p.item);// 20
}
}
思考:如果初始化块在继承链中,又是怎么样?
总结:父类静态初始化块-->子类静态初始化块-->父类非静态初始化块-->父类构造器-->子类非静态初始化块-->子类构造器
/**
* @author Lantzrung
* @date 2022年7月22日
* @Description
*/
package com.g0714work.copy;
public class Test02 {
public static void main(String[] args) {
Student p = new Student("zhang", "nan", 18);
System.out.println(p);
// Person静态初始化块执行
// Student静态初始化块执行
// Person非静态初始化块执行
// Person全参构造器初始化块执行
// Student非静态初始化块执行
// Student全参构造器初始化块执行
// 总结:子类构造器-->子类非静态初始化块-->父类构造器-->父类非静态初始化块-->子类静态初始化-->父类静态初始化块
}
}
/**
* @author Lantzrung
* @date 2022年7月21日
* @Description
*/
public class Person {
public String name;
public String sex;
public int age;
static {
System.out.println("Person静态初始化块执行");
}
{
System.out.println("Person非静态初始化块执行");
}
public Person(String name, String sex, int age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
System.out.println("Person全参构造器初始化块执行 ");
}
public Person() {
super();
System.out.println("Person无参构造器初始化块执行 ");
}
}
/**
* @author Lantzrung
* @date 2022年7月21日
* @Description
*/
public class Student extends Person {
static {
System.out.println("Student静态初始化块执行");
}
{
System.out.println("Student非静态初始化块执行");
}
public Student() {
super();
System.out.println("Student无参构造器初始化块执行 ");
}
public Student(String name, String sex, int age) {
super(name, sex, age);
System.out.println("Student全参构造器初始化块执行 ");
}
}