黑马程序员技术交流社区

标题: 静态代码块和构造代码块 [打印本页]

作者: 王春蕾    时间: 2014-4-14 12:53
标题: 静态代码块和构造代码块
  1. class Day06
  2. {
  3.         static int i=2;//随着类的加载而加载。加载到方法区中的静态区中。
  4.         int j=9;//定义了一个属性,也就是一个成员变量,也叫实例变量。当对象存在时,该变量存在于堆内存的对象中。

  5.         static{//静态代码块。随着类的加载而执行。
  6.            System.out.println("静态代码块...i="+i);
  7.         }
  8.        
  9.         Day06(int a){//带一个int参数的构造函数。
  10.                 this();//调用了本类中空参数的构造函数。
  11.            System.out.println("有参的构造函数...i="+i+",j="+j);
  12.         }

  13.         { //构造代码块,定义在类中的代码块,用于给所有对象进行初始化动作的代码块。
  14.            System.out.println("构造代码块...i="+i+",j="+j);
  15.         }

  16.         static void show(){//静态函数。函数中没有访问非静态的成员。
  17.             System.out.println("静态show方法...i="+i);
  18.         }

  19.         Day06(){// 空参数的构造函数。
  20.            System.out.println("无参的构造函数..."+",j="+j);
  21.         }
  22. }

  23. class Test
  24. {
  25.         public static void main(String[] args)
  26.         {
  27.                 Day06 d = new Day06(1);//通过Day06.class类文件创建了对象。
  28.                 int a = Day06.i;
  29.                 System.out.println(a);
  30.                 System.out.println("----");
  31.                 new Day06(3);
  32.                 show();               
  33.         }
  34.         public static void show()
  35.         {
  36.         }
  37. }
复制代码


请问程序的运行结果是什么?为什么》
作者: 杨殿生    时间: 2014-4-14 14:13
明确了类初始化的顺序就能明白这是怎么执行的了
Day06 d = new Day06(1)
这一句整个过程如下
1,首先加载Day06的类,同时加载静态成员和静态代码块,这时i=2,输出  静态代码块...i=2,
2,对对象进行默认初始化,这时j=9
3,对对象进行显示初始化
4,对对象进行构造代码块初始化,这时输出  构造代码块...i=2,j=9
5,调用带参数的构造函
6,调用无参数的构造函数 输出  无参的构造函数...j=9
7,回到带参数的构造函数中  输出 有参的构造函数...i=2,j=9




int a = Day06.i;
将i值付给a,   a=2


输出 2
输出 ----


new Day06(3);
除了不加载静态代码块剩下的与第一句都是相同的




构造代码.png (104.34 KB, 下载次数: 13)

构造代码.png





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2