A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 天下 中级黑马   /  2013-10-30 16:58  /  1650 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 天下 于 2013-10-31 08:11 编辑
  1. public class Test1 {
  2.    {
  3.          a = 1;
  4.          System.out.println(a);//这里会抛错。
  5.      }
  6.       private int a;
  7.      public static void main(String[] args){
  8.      Test1 test1 = new Test1();
  9.      System.out.println(test1.a);
  10.     }
  11. }
  12. --------------------------------------------------------
  13. 报错
  14. public class Test6 {

  15.      {
  16.          a = 4;
  17.      }

  18.      private static final int a;

  19.      public static void main(String[] args){
  20.               System.out.println(a);
  21.      }
  22. }
  23. --------------------------------------------------------
  24. 这个又没有问题
  25. public class Test7 {

  26.    static{
  27.           a = 5;
  28.       }

  29.        private static final int a;


  30.        public static void main(String[] args){
  31.          System.out.println(a);
  32.      }
  33. }
  34. =========================一下子,变量初始化把我搞晕了,test1和test6为什么报错,test7为什么又没有问题????
复制代码

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
  1. /*
  2. 问题在于构造代码块、静态代码块和对象的加载顺序,
  3. 并且要明确构造代码块只有对象存在时才会执行:

  4. 对于Test1:构造代码块是给对象进行初始化,运行时,
  5. 对象中的成员变量private int a根本还没有进内存;
  6. 所以楼主可以用我修改过的方法来验证:

  7. 对于Test6: 若变量一被声明为final,则它的值就不可再改变,
  8. 并且,楼主要注意的是:构造代码块只有存在对象时才执行,并且,
  9. 静态变量先于对象存在于一个单独的静态区中,所以,楼主可以用我在以下
  10. 修改的方法中进行验证:

  11. 对于Test7:是因为静态成员变量int a先于对象存在于静态区中,静态代码块:
  12. static{}也先于对象存在,并是给主函数进行初始化,所以,可以执行正确,
  13. 但是,若是将a声明为final则同样会报错;

  14. 如下注释:

  15. */
  16. class Test1 {
  17.          //先运行构造代码块(因为主函数中创建了对象),此时,对象中的成员变量private int a还未加载;
  18.          {        int a;//给a指定数据类型
  19.          a = 1;
  20.          System.out.println(a);
  21.      }
  22.       private  int a;//-->这里运行后是0;
  23.      public static void main(String[] args)
  24.         {
  25.      Test1 test1 = new Test1();
  26.      System.out.println(test1.a);
  27.     }
  28. }

  29. --------------------------------------------------------

  30. class Test6 {

  31.      { //静态代码块执行之前,静态区中已经存在静态变量a
  32.        a = 4;
  33.                 System.out.println("test:"+a);
  34.      }

  35.      private  static /*final*/ int  a=3;//若变量一被声明为final则不可再改变;

  36.      public static void main(String[] args)
  37.         {
  38.               System.out.println("hh"+new Test6().a);
  39.     }
  40. }

  41. --------------------------------------------------------
  42. class Test7 {

  43.    static{
  44.           a = 5;
  45.       }

  46.        private static final int a;
  47.            /*如果这里指定了a的值,如private Static final int a=9;
  48.            那么就会出错因为final变量的值不可再改变
  49.            */

  50.        public static void main(String[] args)
  51.         {
  52.          System.out.println(a);
  53.      }
  54. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

回复 使用道具 举报
给你看一个例子
  1. class StaticCode
  2. {
  3.         StaticCode()
  4.         {
  5.                 System.out.println("a");
  6.         }
  7.         static//静态代码块,用于给类初始化
  8.         {
  9.                 System.out.println("b");
  10.         }
  11.         {//构造代码块,给对象初值化
  12.                 System.out.println("c");
  13.         }
  14.         StaticCode(int x)
  15.         {
  16.                 System.out.println("d");
  17.         }
  18.         public static void main(String[] args)
  19.         {
  20.                 new StaticCode(4);
  21.         }
  22. }
复制代码
打印结果:
b
c
d

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

回复 使用道具 举报
貌似里清了顺序,感谢大家
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马