Java中成员变量分为两类:1、类变量 2、实例变量
1、类变量初始化
类变量简单来说就是被static
修饰的变量,类变量属于类本身
1.1 初始化时机
- 定义类变量时指定初始化
- 静态代码块中对类变量指定初始化
1.2 初始化顺序
上述两种方式在程序中的排列顺序即为执行顺序
class ClassVarInit{
static int value=10;
static{
value=100;
name="静态代码块中对类变量指定初始化";
}
static String name="定义类变量时指定初始化";
public static void main(String[] args){
System.out.println(value);//输出:100
System.out.println(name);//输出:"定义类变量时指定初始化"
}
}
利用javap
工具可以明显的看到类变量的赋值顺序
javap -c ClassVarInit.class
Compiled from "ClassVarInit.java"
public class demo.ClassVarInit {
static int value;
static java.lang.String name;
public demo.ClassVarInit();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang
/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/
System.out:Ljava/io/PrintStream;
3: getstatic #3 // Field value:I
6: invokevirtual #4 // Method java/io/P
rintStream.println:(I)V
9: getstatic #2 // Field java/lang/
System.out:Ljava/io/PrintStream;
12: getstatic #5 // Field name:Ljava
/lang/String;
15: invokevirtual #6 // Method java/io/P
rintStream.println:(Ljava/lang/String;)V
18: return
static {};
Code:
0: bipush 10
2: putstatic #3 // Field value:I
5: bipush 100
7: putstatic #3 // Field value:I
10: ldc #7 // String 静态代码
块中对类变量指定初始化
12: putstatic #5 // Field name:Ljava
/lang/String;
15: ldc #8 // String 定义类变
量时指定初始化
17: putstatic #5 // Field name:Ljava
/lang/String;
20: return
}
2、实例变量初始化
实例变量属于实例对象
2.1 初始化时机
- 定义实例变量时指定初始化
- 非静态代码块中对实例变量指定初始化
- 构造器中对实例变量指定初始化
2.2 初始化顺序
前两种方式在程序中的排列顺序即为执行顺序,且都优先于构造器初始化
class InstanceVarInit{
public InstanceVarInit(int value,String name){
this.value=value;
this.name=name;
}
int value=10;
{
value=100;
name="非静态代码块中对实例变量指定初始化";
}
String name="定义实例变量时指定初始化";
public static void main(String[] args){
InstanceVarInit obj=new InstanceVarInit(1000,"构造器中对实例变量指定初始化");
System.out.println(obj.value);//输出:1000
System.out.println(obj.name);//输出:"构造器中对实例变量指定初始化"
}
}
javap -c InstanceVarInit.class
Compiled from "InstanceVarInit.java"
public class demo1.InstanceVarInit {
int value;
java.lang.String name;
public demo1.InstanceVarInit(int, java.lang.String);
Code:
0: aload_0
1: invokespecial #1 // Method java/lang
/Object."<init>":()V
4: aload_0
5: bipush 10
7: putfield #2 // Field value:I
10: aload_0
11: bipush 100
13: putfield #2 // Field value:I
16: aload_0
17: ldc #3 // String 非静态代
码块中对实例变量指定初始化
19: putfield #4 // Field name:Ljava
/lang/String;
22: aload_0
23: ldc #5 // String 定义实例
变量时指定初始化
25: putfield #4 // Field name:Ljava
/lang/String;
28: aload_0
29: iload_1
30: putfield #2 // Field value:I
33: aload_0
34: aload_2
35: putfield #4 // Field name:Ljava
/lang/String;
38: return
public static void main(java.lang.String[]);
Code:
0: new #6 // class demo1/Inst
anceVarInit
3: dup
4: sipush 1000
7: ldc #7 // String 构造器中
对实例变量指定初始化
9: invokespecial #8 // Method "<init>":
(ILjava/lang/String;)V
12: astore_1
13: getstatic #9 // Field java/lang/
System.out:Ljava/io/PrintStream;
16: aload_1
17: getfield #2 // Field value:I
20: invokevirtual #10 // Method java/io/P
rintStream.println:(I)V
23: getstatic #9 // Field java/lang/
System.out:Ljava/io/PrintStream;
26: aload_1
27: getfield #4 // Field name:Ljava
/lang/String;
30: invokevirtual #11 // Method java/io/P
rintStream.println:(Ljava/lang/String;)V
33: return
}