1 、 Java虚拟机
java虚拟机运行时结构如下
2、指针?引用?
对于java来说,一切new的的对象在堆中分配内存,而函数参数的传递则利用栈完成。除了java中的基本类型外,一切都是对象。基本类型的传递通过栈来完成,采用的是拷贝方式。<对于对象传递,实际上是对象地址的赋值传递。也是通过堆栈传递。
3、代码示例
(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) 相关知识:
[1]java的初始化规则:
1>类加载阶段初始化: (1)静态变量 (2)静态初始化块 对象声明时初始化 (1)变量 (2)初始化块 (3)构造器
2> 在上述两个阶段中 子类的初始化在父类初始化完成后进行
3> 在上述规则满足条件下,初始化顺序和他们在类中定义顺序相同 java只会为类变量进行初始化,所有基本类型都会有一个固定初始值,非基本类型被初始化为NULL.但是方法中的局部变量不会被初始化,必须手动初始化,否则会报如下错 The local variable i may not have been initialized 类中static变量只会被初始化一次
[2]不同关键字声明的访问权限
访问权限 类内部 package内 子类 其他
public 允许 允许 允许 允许
protected 允许 允许 允许 不允许
default 允许 允许 不允许 不允许
private 允许 不允许 不允许 不允许
[3]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 后退出。