您的位置:首页 > 编程语言 > Java开发

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

2017-09-25 22:58 232 查看
初始化块

一个类里面可以定义多个初始化块,相同类型的初始化有顺序,前面定义的先执行,后定义的后执行,有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修饰的块只创建一次。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息