今天,我们来一起了解 JAVA 类中成员初始化的相关过程。
首先,我们必须知道的是,每个基本类型的成员变量即便不进行初始化,其也会拥有默认值(char类型默认值为空字符串),每种基本类型的默认值如下:
public class InitTemplate {
boolean bo;
char c;
byte by;
short s;
int i;
long l;
float f;
double d;
@Override
public String toString() {
return "InitTemplate{" +
"bo=" + bo +
", c=" + c +
", by=" + by +
", s=" + s +
", i=" + i +
", l=" + l +
", f=" + f +
", d=" + d +
'}';
}
}
public static void main(String[] args) {
InitTemplate initTemplate = new InitTemplate();
System.out.println(initTemplate.toString());
}
InitTemplate{bo=false, c= , by=0, s=0, i=0, l=0, f=0.0, d=0.0}
如果成员变量为一个对象,又未将其初始化,则默认值为 null ,直接调用这个对象会抛出空指针异常。
我们可以在定义对象时,直接为成员变量进行初始化赋值。
public class InitTemplate {
boolean bo = true;
char c = 'c';
byte by = 'b';
short s = 1;
int i = 2;
long l = 3L;
float f = 4.2f;
double d = 5.6;
Student student = new Student("小明", 12);
}
除此以外,还可以通过对象的构造器进行初始化(常用此种方式)。
public class InitTemplate {
boolean bo ;
int i ;
double d ;
public InitTemplate(boolean bo, int i, double d) {
this.bo = bo;
this.i = i;
this.d = d;
}
}
其次,对象类的成员变量的初始化是按顺序执行:静态对象成员>非静态对象成员>构造方法。
public class Bowl {
public Bowl(int i) {
System.out.println("我是第" + i + "只碗");
}
}
public class Table {
static Bowl bowl1 = new Bowl(1);
Bowl bowl2 = new Bowl(2);
Bowl bowl3;
public Table() {
this.bowl3 = new Bowl(3);
}
public static void main(String[] args) {
Table table1 = new Table();
System.out.println("第二轮创建");
Table table2 = new Table();
}
}
我是第1只碗
我是第2只碗
我是第3只碗
第二轮创建
我是第2只碗
我是第3只碗
从上个例子,还可以得出:静态对象成员的初始化只会在类第一次加载的时候执行,并且仅执行一次。
除此之外,还可以使用静态代码块进行初始化操作,静态块用 static 关键字加上 {} 表示,只会在类第一次加载时执行,且执行一次。
public class Table {
static Bowl bowl1;
Bowl bowl2 = new Bowl(2);
static {
System.out.println("执行静态块");
bowl1=new Bowl(1);
}
Bowl bowl3;
public Table() {
System.out.println("执行构造方法");
this.bowl3 = new Bowl(3);
}
public static void main(String[] args) {
Table table1 = new Table();
System.out.println("第二轮创建");
Table table2 = new Table();
}
}
执行静态块
我是第1只碗
我是第2只碗
执行构造方法
我是第3只碗
第二轮创建
我是第2只碗
执行构造方法
我是第3只碗
其实将静态代码块的 static 关键字去除,还可以衍生成另一种用法。此时的代码块会在每次调用 new() 生成对象时执行,并且执行顺序位于构造方法之前,静态对象之后。
public class Table {
Bowl bowl1;
{
System.out.println("执行初始化");
bowl1 = new Bowl(1);
}
static Bowl bowl2 = new Bowl(2);
Bowl bowl3;
public Table() {
System.out.println("执行构造方法");
this.bowl3 = new Bowl(3);
}
public static void main(String[] args) {
Table table1 = new Table();
System.out.println("第二轮创建");
Table table2 = new Table();
}
}
我是第2只碗
执行初始化
我是第1只碗
执行构造方法
我是第3只碗
第二轮创建
执行初始化
我是第1只碗
执行构造方法
我是第3只碗
本次分享至此结束,希望本文对你有所帮助,若能点亮下方的点赞按钮,在下感激不尽,谢谢您的【精神支持】。
若有任何疑问,也欢迎与我交流,若存在不足之处,也欢迎各位指正!