黑马程序员技术交流社区
标题:
这段代码可以讨论下
[打印本页]
作者:
高欢欢
时间:
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 ;
}
非静态代码块,在没有创建对象时根本不会执行到。只有静态代码块在类加载时自动执行的。非静态代码块是在创建对象时自动执行的代码,不创建对象不执行该类的非静态代码块。且执行顺序为静态代码块------非静态代码块----构造函数。
写个例子
public class TestStaticCon {
public static int a = 0;
static {
a = 10;
System.out.println("父类的静态代码块在执行a=" + a);
}
{
a = 8;
System.out.println("父类的非静态代码块在执行a=" + a);
}
public TestStaticCon() {
this("a在父类带参构造方法中的值:" + TestStaticCon.a); // 调用另外一个构造方法
System.out.println(a);
System.out.println("父类无参构造方法在执行a=" + a);
}
public TestStaticCon(String n) {
System.out.println(n);
System.out.println(a);
}
public static void main(String[] args) {
TestStaticCon tsc = null;
System.out.println("!!!!!!!!!!!!!!!!!!!!!");
tsc = new TestStaticCon();
}
}
复制代码
运行结果
捕获.PNG
(18.08 KB, 下载次数: 10)
下载附件
2012-7-16 14:07 上传
作者:
王海亮
时间:
2012-7-16 14:08
初始代码块 你没实例化一次它就执行一次
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2