- /*
- 问题在于构造代码块、静态代码块和对象的加载顺序,
- 并且要明确构造代码块只有对象存在时才会执行:
-
- 对于Test1:构造代码块是给对象进行初始化,运行时,
- 对象中的成员变量private int a根本还没有进内存;
- 所以楼主可以用我修改过的方法来验证:
- 对于Test6: 若变量一被声明为final,则它的值就不可再改变,
- 并且,楼主要注意的是:构造代码块只有存在对象时才执行,并且,
- 静态变量先于对象存在于一个单独的静态区中,所以,楼主可以用我在以下
- 修改的方法中进行验证:
- 对于Test7:是因为静态成员变量int a先于对象存在于静态区中,静态代码块:
- static{}也先于对象存在,并是给主函数进行初始化,所以,可以执行正确,
- 但是,若是将a声明为final则同样会报错;
-
- 如下注释:
-
- */
- class Test1 {
- //先运行构造代码块(因为主函数中创建了对象),此时,对象中的成员变量private int a还未加载;
- { int a;//给a指定数据类型
- a = 1;
- System.out.println(a);
- }
- private int a;//-->这里运行后是0;
- public static void main(String[] args)
- {
- Test1 test1 = new Test1();
- System.out.println(test1.a);
- }
- }
- --------------------------------------------------------
- class Test6 {
- { //静态代码块执行之前,静态区中已经存在静态变量a
- a = 4;
- System.out.println("test:"+a);
- }
- private static /*final*/ int a=3;//若变量一被声明为final则不可再改变;
- public static void main(String[] args)
- {
- System.out.println("hh"+new Test6().a);
- }
- }
- --------------------------------------------------------
- class Test7 {
- static{
- a = 5;
- }
- private static final int a;
- /*如果这里指定了a的值,如private Static final int a=9;
- 那么就会出错因为final变量的值不可再改变
- */
- public static void main(String[] args)
- {
- System.out.println(a);
- }
- }
复制代码 |