Java——初始化块,初始化块与构造方法,静态初始化块

初始化块
一个类里面可以定义多个初始化块,相同类型的初始化有顺序,前面定义的先执行,后定义的后执行,有static的先执行。
语法格式如下:
[修饰符]{
//初始化可执行的代码

注意:修饰符只能使用static。

public class Person {
// 两个成员变量name age
private String name;
private int age;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

/***
 * 无参构造方法
 */
public Person() {
    System.out.println("这是父类的构造方法");
}

public static void main(String[] args) {
    new Person();

}

{
    setName("李四");
    setAge(12);
    System.out.println("第一个初始化块--Person的姓名:" + getName() + ",Person的年龄:" + getAge());
}

{
    setName("王五");
    setAge(13);
    System.out.println("第二个初始化块--Person的姓名:" + getName() + ",Person的年龄:" + getAge());

}
}

执行后的结果是:
第一个初始化块–Person的姓名:李四,Person的年龄:12
第二个初始化块–Person的姓名:王五,Person的年龄:13
这是父类的构造方法
如果我们添加上修饰符呢
package com.shenjian.base;

import com.shenjian.Student;

public class Person {
// 两个成员变量name age
private String name;
private int age;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

/***
 * 无参构造方法
 */
public Person() {
    System.out.println("这是父类的构造方法");
}

public static void main(String[] args) {
    new Person();
    //去掉注释进行对比
    //new Person();
}

{
    setName("李四");
    setAge(12);
    System.out.println("第一个初始化块--Person的姓名:" + getName() + ",Person的年龄:" + getAge());
}

{
    setName("王五");
    setAge(13);
    System.out.println("第二个初始化块--Person的姓名:" + getName() + ",Person的年龄:" + getAge());

}
static {
    System.out.println("第三个初始化块(static)--Person的姓名:");

}

}
结果是:
第三个初始化块(static)–Person的姓名:
第一个初始化块–Person的姓名:李四,Person的年龄:12
第二个初始化块–Person的姓名:王五,Person的年龄:13
这是父类的构造方法
去掉注释(mian方法中),结果是:
第三个初始化块(static)–Person的姓名:
第一个初始化块–Person的姓名:李四,Person的年龄:12
第二个初始化块–Person的姓名:王五,Person的年龄:13
这是父类的构造方法
第一个初始化块–Person的姓名:李四,Person的年龄:12
第二个初始化块–Person的姓名:王五,Person的年龄:13
这是父类的构造方法
从结果中我们可以看到有初始化块要比构造方法先执行,带static修饰符的初始化块比普通初始化块先执行,但是每次只创建一次。如果让子类继承呢,先建Student类继承Person,在创建一个LiuTao类继承Student类,里面分别写一个带static的初始化块和一个不带static的初始化块,一个构造方法。
public class Student extends Person {
{
System.out.println(“Student的第1个块”);
}
Student(){
System.out.println(“Student的构造方法”);
}
static {
System.out.println(“Student的第2个块(static)”);
}
}
public class LiuTao extends Student {
{
System.out.println(“LiuTao的第1个块”);
}
LiuTao(){
System.out.println(“LiuTao的构造方法”);
}
static {
System.out.println(“LiuTao的第2个块(static)”);
}
public static void main(String[] args) {
new LiuTao();
new LiuTao();
}

}
运行效果如下:
第三个初始化块(static)–Person的姓名:
Student的第2个块(static)
LiuTao的第2个块(static)
第一个初始化块–Person的姓名:李四,Person的年龄:12
第二个初始化块–Person的姓名:王五,Person的年龄:13
这是父类的构造方法
Student的第1个块
Student的构造方法
LiuTao的第1个块
LiuTao的构造方法
第一个初始化块–Person的姓名:李四,Person的年龄:12
第二个初始化块–Person的姓名:王五,Person的年龄:13
这是父类的构造方法
Student的第1个块
Student的构造方法
LiuTao的第1个块
LiuTao的构造方法
结果发现,只要是以static修饰的初始化块先执行一边,执行顺序是从最开始的父类到最后的子类,再执行最开始的父类初始化块和构造方法,之后是直接父类的初始化块和构造方法,最后是自己的初始化块和构造方法。Stati修饰的块只创建一次。

猜你喜欢

转载自blog.csdn.net/qq524752841/article/details/78090518