标签:
java 变量类型如下:
实例变量;
类变量;
初始化途经如下:
实例变量
--声明时,初始化;
--非静态初始化块内,初始化;
--构造函数内,初始化;
实例1:
public class bean1 { int d; int e; int c; int b; int f; { c = 3; } int a = 1; { b = 2; } public bean1() { d = 4; f = 5; e = 6; } public int geta() { return a; } }
javap -c bean1.class 查看反汇编代码如下:
Compiled from "bean1.java" public class initialization.bean1 { int d; int e; int c; int b; int f; int a; public initialization.bean1(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: aload_0 5: iconst_3 //初始化c 6: putfield #2 // Field c:I 9: aload_0 10: iconst_1 //初始化a 11: putfield #3 // Field a:I 14: aload_0 15: iconst_2 //初始化b 16: putfield #4 // Field b:I 19: aload_0 20: iconst_4 //初始化d 21: putfield #5 // Field d:I 24: aload_0 25: iconst_5 26: putfield #6 // Field f:I 29: aload_0 30: bipush 6 32: putfield #7 // Field e:I 35: return public int geta(); Code: 0: aload_0 1: getfield #3 // Field a:I 4: ireturn }
结论:实例变量的初始化均在public initialization.bean1()当中完成,无论是在声明时直接初始化,还是在代码块当中初始化,本质均在构造函数里面进行初始化,在构造函数当中的初始化顺序取决于在 定义直接初始化和代码块初始化中的顺序。
类变量
--声明时,初始化;
--静态初始化块内,初始化;
实例2:
package initialization; public class bean2 { static int d; static int e = 5; static int c; int b; int f; int a = 1; static { c = 3; System.out.println("hello,static"); } { b = 2; System.out.println("hello"); } static { d = 4; } public bean2() { f = 6; } public int geta() { return a; } }
新建bean2实例时,输出如下:
hello,static hello
静态代码块是主动执行的,需要在项目启动的时候就初始化;
javap -c bean2.class 查看反汇编代码如下:
Compiled from "bean2.java" public class initialization.bean2 { static int d; static int e; static int c; int b; int f; int a; public initialization.bean2(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: aload_0 5: iconst_1 //初始化a 6: putfield #2 // Field a:I 9: aload_0 10: iconst_2 //初始化b 11: putfield #3 // Field b:I 14: aload_0 15: bipush 6 17: putfield #4 // Field f:I 20: return public int geta(); Code: 0: aload_0 1: getfield #2 // Field a:I 4: ireturn static {}; Code: 0: iconst_5 //初始化e 1: putstatic #5 // Field e:I 4: iconst_3 //初始化c 5: putstatic #6 // Field c:I 8: iconst_4 //初始化d 9: putstatic #7 // Field d:I 12: return }
结论: 实例变量的初始化均在public initialization.bean2()当中完成,无论是在声明时直接初始化,还是在代码块当中初始化,本质均在构造函数里面进行初始化,在构造函数当中的初始化顺序取决于在 定义直接初始化和代码块初始化中的顺序;
类变量在static {}中完成,且初始顺序以代码中顺序为主,类变量在实例变量前执行;
关于java final可以查看:http://www.cnblogs.com/dolphin0520/p/3736238.html
标签:
原文地址:http://www.cnblogs.com/TheLastDayAndNight/p/4595191.html