Java面向对象之JVM内存解析、对象创建的过程


前言

 今天继续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的内存解析和创建对象的过程。之后的学习内容将持续更新!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只咸鱼。。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值