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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© rover0321 中级黑马   /  2014-6-9 23:41  /  1282 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1.先贴代码
  1. public class DemoClass
  2. {
  3.    
  4.     /**
  5.      * @param args the command line arguments
  6.      */
  7.     public static void main(String[] args)
  8.     {
  9.         // TODO code application logic here
  10.         new Demo().show();
  11.     }
  12.    
  13. }
  14. class Demo
  15. {
  16.     // 静态变量显示初始化
  17.     private static int a = 3;
  18.    
  19.     // 实例成员变量
  20.     private String string = "实例变量显式初始化";
  21.    
  22.     static
  23.     {
  24.         System.out.println(a); // 输出结果为3,说明静态变量的初始化在静态代码块之前。
  25.     }
  26.    
  27.     {
  28.         System.out.println(string);
  29.         // 输出结果为实例变量,说明实例对象的显示初始化在非静态代码块之前。
  30.     }
  31.    
  32.     public Demo()
  33.     {
  34.         // 构造函数中对string 进行操作。
  35.         this.string = "构造函数";
  36.     }
  37.    
  38.     public void show()
  39.     {
  40.         // 显示string 的最终结果
  41.         System.out.println(string);
  42.     }
  43. }
复制代码
2.程序输出

3.结论
1.从文件中加载Demo类到内存中
2.静态变量显式初始化
3.执行类的静态代码块
4.在堆中分配内存空间给非静态变量
5.对非静态变量进行默认初始化
6.对非静态变量进行显式初始化
7调用非静态代码块(构造代码块)
8调用构造函数进行特定初始化

4.求证:
求教大家:类中成员的初始化顺序是结论中那样的吗?谢谢!

QQ图片20140609230040.jpg (12.54 KB, 下载次数: 22)

程序输出结果

程序输出结果

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

7 个回复

倒序浏览
2与3我验证过没有谁先谁后之说,谁写在前面谁先执行
回复 使用道具 举报
有时候 太细了 就纠结了,正真应该站在项目的高度
回复 使用道具 举报
跟老毕说的差不多,有一点不对,静态代码块和静态变量的顺序取决于代码的先后。谁在前面,谁先运行
看代码
class demo3{
        public static int x=3;
        static{
                System.out.println(x);         
                System.out.println("静态代码块");
        }
}
结果:3先运行
class demo3{       
        static{                 
                System.out.println("静态代码块");
        }
        public static int x=3;
        static{
                System.out.println(3);
        }       
}
结果:静态代码块先运行。

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

回复 使用道具 举报 1 0
谭荣强 发表于 2014-6-10 02:31
跟老毕说的差不多,有一点不对,静态代码块和静态变量的顺序取决于代码的先后。谁在前面,谁先运行
看代码
...

多谢您了!
回复 使用道具 举报
cain 发表于 2014-6-10 00:46
有时候 太细了 就纠结了,正真应该站在项目的高度

学习阶段,我想扣细点,不然出了问题不知道原因。
回复 使用道具 举报
java木 发表于 2014-6-10 00:27
2与3我验证过没有谁先谁后之说,谁写在前面谁先执行

不操作静态变量的话确实没什么先后之分。
回复 使用道具 举报
  1. package test;


  2. /**
  3. * @author Administrator
  4. *测试类成员的初始化的顺序
  5. */
  6. public class InitClassMemberSquenceTest
  7. {
  8.    
  9.     /**
  10.      * @param args the command line arguments
  11.      *1.从文件中加载Demo类到内存中
  12.      *2.静态变量显式初始化(或执行类的静态代码块,与它们在程序中被调用的位置有关)
  13.          *3.执行类的静态代码块(或静态变量显式初始化,与它们在程序中的被调用位置有关)
  14.          *4.在堆中分配内存空间给非静态变量
  15.          *5.对非静态变量进行默认初始化(或对非静态变量进行显式初始化,与它们在程序中被调用的位置有关)
  16.          *6.对非静态变量进行显式初始化(对非静态变量进行默认初始化,与它们在程序中被调用的位置有关)
  17.          *7.调用非静态代码块(构造代码块)
  18.          *8.调用构造函数进行特定初始化
  19.      */
  20.     public static void main(String[] args)
  21.     {
  22.         // TODO code application logic here
  23.         new Demo().show();
  24.     }
  25.    
  26. }
  27. class Demo
  28. {
  29.     // 静态变量显示初始化
  30.     private static int a = 3;
  31.    
  32.     // 实例成员变量
  33.     private String string ="实例变量显式初始化";
  34.     private int i;
  35.    
  36.     static
  37.     {       
  38.             System.out.println("静态代码块"); // 静态变量的初始化和静态代码块的执行顺序只与它们在程序中的书写顺序有关,没有指定的先后之分
  39.         System.out.println(a); //
  40.        // System.out.println("静态代码块");
  41.     }
  42.     /*
  43.     {
  44.         System.out.println(i);
  45.         // 输出结果为0,对非静态变量进行默认初始化
  46.     }
  47.     */
  48.     {
  49.         System.out.println(string);
  50.         // 输出结果为实例变量,说明实例对象的显示初始化在非静态代码块之前。
  51.     }
  52.    
  53.    
  54.     {
  55.         System.out.println(i);
  56.         // 输出结果为0,对非静态变量进行默认初始化
  57.     }
  58.    
  59.     public Demo()
  60.     {
  61.         // 构造函数中对string 进行操作。
  62.         this.string = "构造函数";
  63.     }
  64.    
  65.     public void show()
  66.     {
  67.         // 显示string 的最终结果
  68.         System.out.println(string);
  69.     }
  70. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马