Java基础教程3:Java虚拟机和程序执行过程

1 、 Java虚拟机
java虚拟机运行时结构如下

2、代码示例

(1)代码如下:

class Insect {
private int i = 9;
protected int j;
Insect() {
print(“i = ” + i + “, j = ” + j); j = 39;
}
private static int x1 = printInit(“static Insect.x1 initialized”); static int printInit(String s) {
print(s);
return 47; }
}
public class Beetle extends Insect {
private int k = printInit(“Beetle.k initialized”);
public Beetle() {
print(“k = ” + k);
print(“j = ” + j);
}
private static int x2 = printInit(“static Beetle.x2 initialized”); //程序入口点
public static void main(String[] args) {
print(“Beetle constructor”);
Beetle b = new Beetle();
}
}

(2) 程序运行结果如下:

static Insect.x1 initialized static Beetle.x2 initialized Beetle constructor i = 9, j = 0 Beetle.k initialized k = 47 j = 39

3、 程序执行过程分析

java的初始化遵循如下规则:
1>类加载阶段初始化: (1)静态变量 (2)静态初始化块 ;
2>对象声明时初始化 :(1)变量 (2)初始化块 (3)构造器
3> 在上述两个阶段中 子类的初始化在父类初始化完成后进行
4> 在上述规则满足条件下,初始化顺序和他们在类中定义顺序相同 java只会为类变量进行初始化,所有基本类型都会有一个固定初始值,非基本类型被初始化为NULL.但是方法中的局部变量不会被初始化,必须手动初始化,否则会报如下错 The local variable i may not have been initialized 类中static变量只会被初始化一次

java程序的执行过程:

写好程序后,javac将程序编译成.class(.jar文件是.class文件的打包),存储类字节码。 执行java程序,启动JVM,将调用用本地代码实现的Bootsstrap class loader,用于加载rt.jar中存储的java核心类 核心类中包含两个类装载器,一个负责加载存放在jre/lib/ext中的jar文件中所存储的类。 JVM会搜索main函数,加载该类,并启动一个新线程执行该main函数,如果发现有尚未加载的类,则用核心类中的类加载器去加载。

4 程序运行过程 结合上述知识,我们可以推论 编译完成后,本例子中会形成Insect.class和Beetle.class两个文件。 JVM找到main方法,加载包含main方法的类。此时开始初始化 Beetle,先对父类进行初始化。所以有打印 static Insect.x1 initialized 然后对子类进行初始化,会打印 static Beetle.x2 initialized 然后执行main函数,会打印 Beetle constructor 然后执行Beetle b = new Beetle();先执行父类的构造方法 i = 9, j = 0 然后初始化子类中的变量,会打印 Beetle.k initialized 最后执行子类的构造方法,打印 k = 47 j = 39 后退出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值