前言
今天继续Java面向对象的学习,了解一下JVM内存解析,3个分区,每个区存放的东西;对象创建的过程,代码执行的先后顺序。
希望能对你的学习有所帮助!
提示:以下是本篇文章正文内容,Java系列学习将会持续更新
一、JVM内存解析
Java中的JVM内存可分为3个区:堆区、栈区、方法区
(1)堆区
1.存储的全部是对象,每个对象都包含一个与之对应的class信息(class的目的是得到操作指令)
2.JVM只有一个堆区被所有线程共享,堆中不存放基本数据类型和对象引用,只存放自定义对象。
(2)栈区
1.栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
2.每个栈区中的数据(原始类型和对象引用)都是私有,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区
(3)方法区
1.方法区又叫做静态区,和堆一样被所有线程共享,方法区包含所有的class和static变量。
2.方法区包含的都是在整个过程中永远唯一的元素,如:class,static变量
图解
代码解析
//运行时,JVM把PhoneDemo的信息放入方法区中
public class PhoneDemo {
//main方法本身放入方法区
public static void main(String[] args){
//p是引用,放在栈区中
Phone p = new Phone();
//new Phone()是自定义对象,放在堆区中
p.name = "华为";
p.price = 3999;
p.color = "blue";
p.call("马云");
}
}
//运行时,JVM把Phone的信息放入方法区中
class Phone {
//new Phone实例后,name引用放在栈区中,name对象放在堆区中
String name;
int price;
String color;
//call()是成员方法,本身放入方法区中
void call(String name){
System.out.println("打电话给" + name);
}
}
二、对象创建的过程
(1)单个对象的创建过程
1.将xxx.class文件中相关类信息读取到内存空间的方法区,这个过程叫做类的加载。
2.当程序开始运行时找main()方法去执行方法体中的语句,使用new来创建对象。
3.若没有执行初始值采用默认初始化,否则采用指定的数值来作为初始化。
4.先执行静态语句块中的语句。
5.再执行构造块,可以通过构造块来更改成员变量的数值。
6.执行构造方法体中的语句可以再次修改成员变量的数值。
7.此时对象创建完毕,继续执行后续的语句。
(2)子类对象的创建过程
1.先加载父类再去加载子类,先执行父类的静态语句块,再执行子类的静态语句块。
2.执行父类的构造块,再去执行父类的构造方法体,此时父类部分构造完毕。
3.执行子类的构造块,再去执行子类的构造方法体,此时子类对象构造完毕。
执行顺序
<1>静态块:用static申明,JVM加载类时执行,仅执行一次
<2>构造块:类中直接用{}定义,每一次创建对象时执行
<3>执行顺序优先级:静态块 > main() > 构造块 > 构造方法(因为main方法也是静态方法)
代码解析
//解析Guocheng类
public class Guocheng {
{
System.out.println("2.Guocheng类中的构造块");
}
public Guocheng() {
System.out.println("3.构造方法体Guocheng()");
}
static {
System.out.println("1.Guocheng()类中的静态语句块");
}
public static void main(String[] args) {
Guocheng g = new Guocheng();
}
}
执行结果:
1.Guocheng()类中的静态语句块
2.Guocheng类中的构造块
3.构造方法体Guocheng()
//解析GuochengZilei类
public class GuochengZilei extends Guocheng {
{
System.out.println("GuochengZilei类中的构造块");
}
public GuochengZilei() {
System.out.println("构造方法体GuochengZilei()");
}
static {
System.out.println("GuochengZilei()类中的静态语句块");
}
public static void main(String[] args) {
GuochengZilei gz = new GuochengZilei();
}
}
执行结果:
1.Guocheng()类中的静态语句块
GuochengZilei()类中的静态语句块
2.Guocheng类中的构造块
3.构造方法体Guocheng()
GuochengZilei类中的构造块
构造方法体GuochengZilei()
总结
提示:这里对文章进行总结:
以上就是今天的学习内容,本文是继续Java面向对象的学习,学习了JVM的内存解析和创建对象的过程。之后的学习内容将持续更新!!!