class loading是一个比较复杂的过程。一般说来,类是在其static member被访问时被加载的。在加载时会做的一件事是:初始化static member和static代码段(static block, i.e. static {......}),当然,static是只会被执行only once的。
以下是一个例子(adapted from Chapter 7, Thinking in Java, Fourth Edition):
//@file Beetle.java
import static java.lang.System.out;
class Insect
{
private int i = 1;
protected int j;
private static int x1 = printInit("static Insect.x1 initialized");
Insect()
{
out.println("Insect constructor");
out.println("i = " + i + ", j = " + j + ", x1 = " + x1);
this.j = 2;
}
static int printInit(String s)
{
out.println(s);
return 3;
}
}
public class Beetle extends Insect
{
private int k = printInit("Beetle.k initialized");
private static int x2 = printInit("static Beetle.x2 initialized");
public Beetle()
{
out.println("Beetle constructor");
out.println("j = " + j + ", k = " + k + ", x2 = " + x2);
}
public static void main(String[] args)
{
Beetle b = new Beetle();
}
}
//output:
/*
static Insect.x1 initialized
static Beetle.x2 initialized
Insect constructor
i = 1, j = 0, x1 = 3
Beetle.k initialized
Beetle constructor
j = 2, k = 3, x2 = 3
*/
->首先,访问Beetle.main(),是个static,好,加载Beetle.class;
-->发现Beetle extends Insect,好,加载Insect.class(如果Insect还有base class,则持续这一过程,直到找到root base class);
---->初始化private static int x1( = 3),打印"static Insect.x1 initialized";
---->Insect.class加载完毕
-->继续加载Beetle.class;
---->初始化private static int x2( = 3),打印"static Beetle.x2 initialized";
---->Beetle.class加载完毕,
->开始执行Beetle.main();
-->要new一个Beetle,须先new一个Insect;
---->在执行Insect constructor前,先要初始化member,由于private static int x1是static且已经初始化了,所以这次只初始化private int i( = 1)和protected int j( = 0 by default);
---->执行Insect constructor,打印"Insect constructor"和"i = 1, j = 0, x1 = 3",然后j = 2;
---->Insect constructor执行完毕,即new Insect过程完毕
-->继续new Beetle;
---->同理,在执行Beetle constructor之前,要先初始化member,这里是初始化private int k( = 3),打印"Beetle.k initialized";
---->执行Beetle constructor,打印"Beetle constructor"和"j = 2, k = 3, x2 = 3";
---->Beetle constructor执行完毕,即new Beetle过程完毕
->Beetle.main()执行完毕。
(2009年03月27日补充:more details see [#0x000B])
(2009年09月04日归纳:[#0x0023])
分享到:
相关推荐
#### 0x00000000:作业完成。 - **描述**:此错误代码表示系统或应用程序的正常终止。 - **解决方案**:无需采取任何措施,这是一个正常的终止代码。 #### 0x00000001:不正确的函数。 - **描述**:该错误提示用户...
##### 0x01: 前台过滤绕过 通过抓包工具如Burp Suite截取上传请求,将文件名中的`.jpg`修改为`.php`(例如:将`evil.jpg`改为`evil.php`),这样可以绕过前端的文件扩展名检查。由于前端验证通常较为简单,这种方法...
- **0x0008**: 内核堆栈空间不足,无法分配。 - **0x0009**: 内核堆栈地址无效。 - **0x000a**: 内核模式下的异常情况。 #### 0x000b - 0x0010 - **0x000b**: 一个设备驱动程序尝试执行不支持的操作。 - **0x000c*...
- **0x0008**: 栈空间不足,无法继续执行。 - **0x0009**: 栈指令无效。 这些错误大多与内存管理和系统初始化有关,通常出现在系统启动阶段。 ### 0x000A - 0x001F:设备驱动与硬件兼容性问题 - **0x000A**: 系统...
#### 0x00000023: FAT_FILE_SYSTEM 和 0x00000024: NTFS_FILE_SYSTEM **解释**:这两个错误代码分别与 FAT 和 NTFS 文件系统有关,通常是因为文件系统损坏或驱动程序问题引起。 **可能的原因**: - 文件系统损坏。...
#### 0x0000000A: IRQL_NOT_LESS_OR_EQUAL **错误分析**:此错误主要由驱动程序的问题、硬件或软件的缺陷引起。技术上讲,它表示在内核模式中,某个进程以过高的中断请求级别(IRQL)访问其不应访问的内存区域。 *...
本文将深入探讨笔记本蓝屏代码的含义、可能的原因以及解决方法,特别关注了几个常见的蓝屏错误代码,包括0x0000000A、0x0000007B、0x000000ED、0x0000007E/0x0000008E、0x00000050和0x000000D1。 #### 0x0000000A:...
- **0x0008**: 内存地址不可用。 - **0x0009**: 文件或设备句柄无效。 ##### 2. 0x000A - 0x001F - **0x000A**: 系统检测到硬件故障。 - **0x000B**: 内存管理异常。 - **0x000C**: 文件或设备不存在。 - **0x000D*...
- **0x0008**: 文件缓冲区太小,无法读取。 - **0x0009**: 文件缓冲区地址无效。 - **0x000A**: 未知错误。 - **0x000B**: 系统无法识别某种格式。 - **0x000C**: 系统无法读取数据。 - **0x000D**: 系统无法执行...
### 0x0008 - 在用户模式下,无法指针 用户模式下的指针问题,通常涉及应用程序或驱动程序。 ### 0x0009 - 在用户模式下,指针无效 同样是用户模式下的指针问题,但更具体地指无效的指针。 ### 0x000a - 内存...
- **0x1029**: 82559 - **0x1030**: 82559 - **0x1031**: 82801CAM - **0x1032**: 82801CAM - **0x1033**: 82801CAM - **0x1034**: 82801CAM - **0x1038**: 82801CAM - **0x1039**: 82801CAM - **0x103A**: 82801DB ...
- **0x0008**: 内存不足,无法分配。 - **0x0009**: 地址无效。 - **0x000a**: 文件类型错误。 - **0x000b**: 不正确的格式或样式。 - **0x000c**: 获取失败。 - **0x000d**: 参数过大。 - **0x000e**: 内存不足,...
- **0x0008**: 尝试访问的地址空间已被占用,不能再次分配。 - **0x0009**: 指定的地址无效。 - **0x000A**: 文件或设备已被占用。 - **0x000B**: 使用了不支持的文件格式。 - **0x000C**: 无法读取请求的数据。 - *...
- **0x0008**:与内存管理相关,提示地址无效或无法访问。 - **0x0009**:涉及无效的内存地址。 ##### 2. **0x000A - 0x001F** - **0x000A**:通常与驱动程序冲突有关。 - **0x000B**:涉及不兼容的硬件配置。 ...
#### 0x00000000 - 未知错误 此错误代码通常表示未知或未定义的系统错误。 #### 0x00000001 - 初始化失败 当系统初始化过程中出现无法处理的问题时会触发此错误代码。 #### 0x00000002 - 系统无法启动 此错误表明...
- **0x0008**:存储空间不足,无法处理该指令。 - **0x0009**:存储控制块地址无效。 - **0x000A**:环境不正确。 - **0x000B**:尝试加载一个格式错误的程序。 - **0x000C**:访问代码错误。 - **0x000D**:数据...
- **0x0008**:地址空间未分配。 - **0x0009**:非法地址。 - **0x000a**:内存页面保护错误。 - **0x000b**:非法系统调用。 - **0x000c**:非法内存读取。 - **0x000d**:堆栈溢出。 - **0x000e**:非法内存写入。...
#### 0x0008 - 地址无效 - **描述**:尝试访问无效的内存地址。 - **可能原因**:驱动程序错误或硬件故障。 #### 0x0009 - 文件不存在 - **描述**:请求访问的文件不存在。 - **可能原因**:文件已被删除或移动。 ...