A:Java虚拟机运行时数据区域(JVM : Java virtual machine)
1. 程序计数器 Program Counter Register
2. 本地方法栈 Native Method Stack
3. 虚拟机栈JVM Stack(方法栈,栈区)
1. 作用:执行方法
2. 程序中所有方法若想执行,必须进栈(压栈),方法执行完弹栈
3. 栈的结构
1. 栈 : 先进后出
2. 队列:先进先出
4. 堆 Heap
1. 保存实体对象和数组
5. 方法区 Method Area
1. 加载存储class文件
B:类加载过程:jvm虚拟机将class文件从硬盘上加载到方法区中,
可见后面反射的类加载器:
对于非静态变量,不是开辟内存空间,只是将被翻译成为二进制的代码加载到方法区内存中。
对于静态变量,jvm虚拟机会在方法区中给静态变量开辟空间,并且先给默认初始化值,然后在赋值。
启动JVM,加载程序中需要使用的class文件。
在加载class文件的时候,所有的静态内容(静态成员变量,静态成员函数,静态代码块)都要加载到方法区的静态区中。
当类中的所有静态加载完成之后,开始给类中的所有静态成员变量默认初始化。
类中的所有静态成员变量默认初始化完成之后,开始给这些静态成员变量显示赋值。
所有静态成员变量显示赋值结束之后,开始运行类中的静态代码块。
当所有的静态代码块执行完成,代表当前这个class文件才彻底被加载结束。
C:new创建一个对象都在内存中做了什么事情?
Student s = new Student();这句代码随着主方法入栈(在栈中生成),只是在堆区中开辟
空间。
1:先将硬盘上指定位置的Person.class文件加载进内存。
2:执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈区分配了一个变量p。
3:使用new关键字创建对象,在栈内存中给对象变量开辟一个空间,在堆内存给对象分配空间。
4:给对象所属类中的所有非静态成员变量分配空间并进行默认初始化。(定义没有直接赋值就会)
5:执行和new对象时传递参数一致的构造方法
执行构造方法的过程中有隐式三步:
①:执行super()语句,找父类的无参构造方法(在这过程中也有隐式三步,执行super()。。。直到超类object类)
②:给非静态成员变量进行显示赋值
③:运行构造代码块
④:执行构造方法中的自己写的代码。
6:将首地址赋值给p ,p变量就引用了该实体。(指向了该对象)
D:new关键字为什么能够开辟空间?(JVM 在windows上,JVM调用windows内存c、c++)
0 . 原理: 子类要能定义成功(能创建对象),必须调用父类的构造方法!(本质调用Object的构造)
1. Object 是所有类(除了Object本身),数组的顶层父类
2. Object 有一个本地方法 native void registerNatives(); - 》 Java调用C、C++(JVM底层)
1. 申请系统资源(内存),就可以创建对象了
3. Object的方法在Object类被加载的时候就执行了(最先加载)
4. Object加载过后,申请到系统资源,对象就可以new了
创建对象申请空间图解: