Java初始化块
文章目录
转载:https://blog.csdn.net/china_songlei/article/details/79696583.
原作者总结的很好,我只是将原作者的工作重复做了一遍,加深记忆…
在Java中,初始化数据字段的方法有三种:
- 显式字段初始化
- 构造器
- 初始化块
初始化块分为普通初始化块与静态初始化块。
一、初始化块的调用时机1
public class InitBlockTest1{
public static void main(String[] args) {
System.out.println(InitBlockDemo1.n);
new InitBlockDemo1();
}
}
class InitBlockDemo1{
static int n=53;
{
System.out.println("普通初始化块");
}
static {
System.out.println("静态初始化块");
}
}
运行结果:
普通初始化块:创建对象时隐式调用
静态初始化块:类加载时隐式调用
二、初始化块的调用时机2
public class InitBlockTest2{
public static void main(String[] args) {
new InitBlockDemo2();
new InitBlockDemo2();
new InitBlockDemo2();
new InitBlockDemo2();
System.out.println(InitBlockDemo2.n);
}
}
class InitBlockDemo2{
static int n=53;
{
System.out.println("普通初始化块");
}
static {
System.out.println("静态初始化块");
}
}
运行结果:
静态初始化块:只在类第一次加载时调用
普通初始化块:可以调用多次,只要创建这个类的对象,普通初始化块就会被调用
三、静态初始化块与普通初始化块的调用优先级
public class InitBlockTest3{
public static void main(String[] args) {
new InitBlockDemo3();
}
}
class InitBlockDemo3{
static int n=53;
{
System.out.println("普通初始化块1");
}
static{
System.out.println("静态初始化块1");
}
{
System.out.println("普通初始化块2");
}
{
System.out.println("普通初始化块3");
}
static{
System.out.println("静态初始化块2");
}
static{
System.out.println("静态初始化块3");
}
}
运行结果:
在一个类中可以定义多个静态初始化块、普通初始化块
调用优先级:静态初始化块 > 普通初始化块
同一类型的初始化块的调用的先后顺序取决于在类中定义的先后顺序
四、显式字段初始化、构造器、初始化块的调用优先级
public class InitBlockTest4{
public static void main(String[] args) {
new InitBlockDemo4();
}
}
class InitBlockDemo4{
public InitBlockDemo4(){
System.out.println("构造器");
}
String a=msg("显式普通字段初始化1");
static{
System.out.println("静态初始化块2");
}
static String b=msg("显式静态字段初始化1");
{
System.out.println("普通初始化块1");
}
String c=msg("显式普通字段初始化2");
{
System.out.println("普通初始化块2");
}
static String d=msg("显式静态字段初始化2");
static{
System.out.println("静态初始化块1");
}
public static String msg(String info){
System.out.println(info);
return info;
}
}
运行结果:
优先级:静态初始化块 | 显式静态字段初始化 > 普通初始化块 | 显式普通字段初始化 > 构造器
静态初始化块与显式静态字段初始化调用的先后顺序取决于在类中定义的先后顺序
普通初始化块与显式普通字段初始化调用的先后顺序取决于在类中定义的先后顺序
五、
//还没学习到继承…
在这里插入代码片
运行结果:
六、静态初始化块中不可访问非静态字段
public class InitBlockTest6{
int a;
static int b;
static {
//a=1; //×
b=2;
}
{
a=1;
b=3;
}
}
静态初始化块不能访问非静态字段