黑马程序员技术交流社区

标题: 这段代码可以讨论下 [打印本页]

作者: 高欢欢    时间: 2012-7-16 13:31
标题: 这段代码可以讨论下
public class Test01 {
{
b = 5 ;
a = b + 1 ;
}
int a ;
int b ;
}



作者: 王飞    时间: 2012-7-16 13:50
帅哥
请问 你想知道什么{:soso_e132:}
作者: 陈世涛    时间: 2012-7-16 13:50
你的程序运行结果会程序报错:
   非法向前引用。
     原因是变量没有先定义,后引用。
     具体的过程如下,希望对你有所帮助,。

类加载主要有三个过程:装载,链接和初始化。
   装载是最好理解的,就是将编译生成的二进制文件装到内存中。
   链接:这个过程又可以分为三个子过程,即校验,准备和解析,
校验当然就是对已装入内存中的二进制类文件校验,检查其是否符合class文件的规范,
同时它还要提取一些类的关键信息,比如变量和方法。准备就是对类变量分配存储空间,同时会初始化。
解析:将符号引用转成直接引用;也就是对引用变量分配空间,并初始化。注意;在链接的时候会对变量分配空间并初始化,
但这时候的初始化并不是很可靠的。
    初始化:这时候会执行真正的初始化语句即执行构造方法对变量初始化。
由以上的过程可以得出在类加载的时候执行的顺序为:静态变量ok  ->  静态代码块  ->
变量ok  ->  普通代码块 ->  构造方法开始执行。

作者: 黑马刘涛    时间: 2012-7-16 14:07
{
b = 5 ;
a = b + 1 ;
}
非静态代码块,在没有创建对象时根本不会执行到。只有静态代码块在类加载时自动执行的。非静态代码块是在创建对象时自动执行的代码,不创建对象不执行该类的非静态代码块。且执行顺序为静态代码块------非静态代码块----构造函数。
写个例子
  1. public class TestStaticCon {
  2.         public static int a = 0;

  3.         static {
  4.                 a = 10;
  5.                 System.out.println("父类的静态代码块在执行a=" + a);
  6.         }
  7.        
  8.         {
  9.                 a = 8;
  10.                 System.out.println("父类的非静态代码块在执行a=" + a);
  11.         }

  12.         public TestStaticCon() {
  13.                 this("a在父类带参构造方法中的值:" + TestStaticCon.a); // 调用另外一个构造方法
  14.                 System.out.println(a);
  15.                 System.out.println("父类无参构造方法在执行a=" + a);
  16.         }

  17.         public TestStaticCon(String n) {
  18.                 System.out.println(n);
  19.                 System.out.println(a);

  20.         }

  21.         public static void main(String[] args) {
  22.                 TestStaticCon tsc = null;
  23.                 System.out.println("!!!!!!!!!!!!!!!!!!!!!");
  24.                 tsc = new TestStaticCon();
  25.         }
  26. }
复制代码
运行结果

捕获.PNG (18.08 KB, 下载次数: 10)

捕获.PNG

作者: 王海亮    时间: 2012-7-16 14:08
初始代码块  你没实例化一次它就执行一次




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