类的成员:属性,方法,构造器,初始化块
初始化块
一、静态初始化块(格式:static{})
1.代码块如果有修饰的话,那么只能使用static
2.基本要求
1)里面可以有输出语句
2)随着类的加载而加载,而且只被加载一次
3)多个静态代码块之间按照顺序结构执行
4)静态代码块的执行要早于非静态代码块的执行
5)静态的代码块中只能调用静态的结构(类属性和类方法)
public class YesStatic{
public static void main(String[] args) {
Static_y s1 = new Static_y();
System.out.println(s1);
System.out.println();
Static_y s2 = new Static_y();
System.out.println(s2);
}
}
class Static_y{
private int id = 1003;
private String name;
private static String desc;
static{
System.out.println("我是第1个静态初始块");
}
static{
setDesc("小明");
System.out.println("我是第2个静态初始块");
}
public Static_y() {
super();
System.out.println("我是这个类的空参的构造器");
}
public Static_y(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Static_y [id=" + id + ", name=" + name + "]";
}
public static String getDesc() {
return desc;
}
public static void setDesc(String desc) {
Static_y.desc = desc;
}
}
运行结果:
二、非静态初始化块(格式{属性赋值等操作})
基本要求
1)可以对类的属性(静态 & 非静态)进行初始化操作,同时也可以调用本类声明的方法(静态 & 非静态)
2)里面可以有输出语句
3)一个类中可以有多个非静态的代码块,多个代码块之间按照顺序结构执行
4)每创建一个类的对象,非静态代码块就会加载一次
5)非静态代码块的执行中构造器总是晚于初始化块的操作
6)非静态的代码块可以调用静态的属性,方法
public class NoStatic {
public static void main(String[] args) {
Static s1 = new Static();
System.out.println(s1);
System.out.println();
Static s2 = new Static();
System.out.println(s2);
}
}
class Static{
private int id = 1003;
private String name;
public static String desc;
//初始化块
{
id = 2309;
name = "lily";
desc = "xiaozhu";
System.out.println("我是第一个非静态初始块");
}
{
id = 2345;
name = "abby";
System.out.println("我是第二个非静态初始块");
}
public Static() {
super();
System.out.println("我是这个类的空参的构造器");
}
public Static(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Static [id=" + id + ", name=" + name + "]";
}
}
运行结果:
典型实例:(静态非静态相结合)
package day10.codelump;
public class ExceCodeLump {
public static void main(String[] args) {
new Leaf();
}
}
class Root{
static {
System.out.println("Root的静态初始化块");
}
{
System.out.println("Root的普通初始化块");
}
public Root() {
System.out.println("Root的无参构造器");
}
}
class Mid extends Root{
static {
System.out.println("Mid的静态初始化块");
}
{
System.out.println("Mid的普通初始化块");
}
public Mid() {
System.out.println("Mid的无参构造器");
}
public Mid(String msg) {
this();
System.out.println("Mid的有参数构造器,其参数值:" + msg);
}
}
class Leaf extends Mid{
static {
System.out.println("Leaf的静态初始化块");
}
{
System.out.println("Leaf的普通初始化块");
}
public Leaf() {
System.out.println("Leaf的无参构造器");
}
}
运行结果: