`

[#0x0008] class loading: an example

    博客分类:
  • Java
J# 
阅读更多

  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*...

    Windows蓝屏画面错误代码说明一览表

    - **0x0008**: 栈空间不足,无法继续执行。 - **0x0009**: 栈指令无效。 这些错误大多与内存管理和系统初始化有关,通常出现在系统启动阶段。 ### 0x000A - 0x001F:设备驱动与硬件兼容性问题 - **0x000A**: 系统...

    计算机蓝屏代码详解,很全的资料

    #### 0x00000023: FAT_FILE_SYSTEM 和 0x00000024: NTFS_FILE_SYSTEM **解释**:这两个错误代码分别与 FAT 和 NTFS 文件系统有关,通常是因为文件系统损坏或驱动程序问题引起。 **可能的原因**: - 文件系统损坏。...

    蓝屏代码含义和解决方案

    #### 0x0000000A: IRQL_NOT_LESS_OR_EQUAL **错误分析**:此错误主要由驱动程序的问题、硬件或软件的缺陷引起。技术上讲,它表示在内核模式中,某个进程以过高的中断请求级别(IRQL)访问其不应访问的内存区域。 *...

    笔记本蓝屏代码.txt

    本文将深入探讨笔记本蓝屏代码的含义、可能的原因以及解决方法,特别关注了几个常见的蓝屏错误代码,包括0x0000000A、0x0000007B、0x000000ED、0x0000007E/0x0000008E、0x00000050和0x000000D1。 #### 0x0000000A:...

    蓝屏代码详细解释(对于电脑爱好者非常珍贵)

    - **0x0008**: 内存地址不可用。 - **0x0009**: 文件或设备句柄无效。 ##### 2. 0x000A - 0x001F - **0x000A**: 系统检测到硬件故障。 - **0x000B**: 内存管理异常。 - **0x000C**: 文件或设备不存在。 - **0x000D*...

    电脑蓝屏,0x电脑报错查询

    - **0x0008**: 文件缓冲区太小,无法读取。 - **0x0009**: 文件缓冲区地址无效。 - **0x000A**: 未知错误。 - **0x000B**: 系统无法识别某种格式。 - **0x000C**: 系统无法读取数据。 - **0x000D**: 系统无法执行...

    电脑蓝屏代码一览表 有助于 你更好的了解你的电脑为什们蓝屏啊!

    ### 0x0008 - 在用户模式下,无法指针 用户模式下的指针问题,通常涉及应用程序或驱动程序。 ### 0x0009 - 在用户模式下,指针无效 同样是用户模式下的指针问题,但更具体地指无效的指针。 ### 0x000a - 内存...

    支持EtherCAT的intel 网卡列表(芯片型号).docx

    - **0x1029**: 82559 - **0x1030**: 82559 - **0x1031**: 82801CAM - **0x1032**: 82801CAM - **0x1033**: 82801CAM - **0x1034**: 82801CAM - **0x1038**: 82801CAM - **0x1039**: 82801CAM - **0x103A**: 82801DB ...

    Windows蓝屏参数

    - **0x0008**: 内存不足,无法分配。 - **0x0009**: 地址无效。 - **0x000a**: 文件类型错误。 - **0x000b**: 不正确的格式或样式。 - **0x000c**: 获取失败。 - **0x000d**: 参数过大。 - **0x000e**: 内存不足,...

    蓝屏错误信息

    - **0x0008**: 尝试访问的地址空间已被占用,不能再次分配。 - **0x0009**: 指定的地址无效。 - **0x000A**: 文件或设备已被占用。 - **0x000B**: 使用了不支持的文件格式。 - **0x000C**: 无法读取请求的数据。 - *...

    Windows蓝屏死机代码完全解析.txt

    - **0x0008**:与内存管理相关,提示地址无效或无法访问。 - **0x0009**:涉及无效的内存地址。 ##### 2. **0x000A - 0x001F** - **0x000A**:通常与驱动程序冲突有关。 - **0x000B**:涉及不兼容的硬件配置。 ...

    常见蓝屏代码,代码蓝屏

    #### 0x00000000 - 未知错误 此错误代码通常表示未知或未定义的系统错误。 #### 0x00000001 - 初始化失败 当系统初始化过程中出现无法处理的问题时会触发此错误代码。 #### 0x00000002 - 系统无法启动 此错误表明...

    电脑蓝屏代码大全.docx

    - **0x0008**:存储空间不足,无法处理该指令。 - **0x0009**:存储控制块地址无效。 - **0x000A**:环境不正确。 - **0x000B**:尝试加载一个格式错误的程序。 - **0x000C**:访问代码错误。 - **0x000D**:数据...

    电脑蓝屏的原因及解决方法大全 以及代码查询txt

    - **0x0008**:地址空间未分配。 - **0x0009**:非法地址。 - **0x000a**:内存页面保护错误。 - **0x000b**:非法系统调用。 - **0x000c**:非法内存读取。 - **0x000d**:堆栈溢出。 - **0x000e**:非法内存写入。...

    Windows xp 蓝屏代码详解

    #### 0x0008 - 地址无效 - **描述**:尝试访问无效的内存地址。 - **可能原因**:驱动程序错误或硬件故障。 #### 0x0009 - 文件不存在 - **描述**:请求访问的文件不存在。 - **可能原因**:文件已被删除或移动。 ...

Global site tag (gtag.js) - Google Analytics