通过字节码深入了解创建对象的过程

2023-10-26

package shixun.test;

public class Test2643 {
	public static void main(String[] args) {
		Person person = new Person();
	}
}

class Tag {
	int i;

	public Tag(int i) {
		this.i = i;
		//System.out.println("Tag(" + this.i + ")");
	}
}

class Person {
	Tag t1 = new Tag(1);
	String name;
	Tag t2 = new Tag(2);
	int age;
	String sex;
	Boolean b1 = new Boolean(false);//Boolean.FALSE;
	//Tag t3 = new Tag(3); 

	public Person() {
		super();
		//System.out.println("构造器Person()被调用");
		sex = "Male";
		//System.out.println("name=" + name + " ,age=" + age + " ,sex=" + sex);
	}

	public Person(String theName) {
		//调用构造器Person()		
		this();
		//System.out.println("构造器Person(String theName)被调用");
		name = theName;
		//System.out.println("name=" + name + " ,age=" + age + " ,sex=" + sex);
	}

	public Person(String theName, int theAge) {
		//调用构造器Person(String theName)
		this(theName);
		//System.out.println("构造器Person(String theName,int theAge)被调用");
		age = theAge;
		//System.out.println("name=" + name + " ,age=" + age + " ,sex=" + sex);
	}

	//初始化块
	{
		this.name = "Tony Blair";
		this.age = 50;

		this.sex = "Female";
		System.out.println("初始化块执行后:name=" + this.name + " ,age=" + this.age + " ,sex=" + this.sex);
		System.out.println(this.t3);
	}
	Tag t3 = new Tag(3);

}

在这里插入图片描述

通过反编译javap -v Person 命令来看一下Person这个对象的字节码文件。

上面的字节码文件代表虚拟机执行源代码的具体顺序
在这里插入图片描述
这个lLineNumberTable对应的是java文件和class文件对应的行数。
根据这张图我们能分析出每次创建对象一定是先开辟空间,给每个属性默认值。然后调用构造方法,但是调用构造方法不代表你就会执行构造方法中的代码,而是先调用父类的构造方法,调用父类的构造方法后面的过程和子类一样就不细说。父类的构造方法执行完毕后,按照顺序初始化属性和执行构造代码块。
这里有个细节,在代码块如果访问该对象的成员变量,如果不加this,只能访问已经被初始化过得成员变量,因为只有初始化完成才会把这个变量放入局部变量表,代码块才能访问到,否则编译不通过,但是如果加了this是一定会访问到,如果没有初始化那么就是默认值。
当上述全部执行完毕后最后再去执行构造方法中的具体代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过字节码深入了解创建对象的过程 的相关文章

随机推荐

  • tvm 入门(二)

    代码是一个tvm入门的例子 以向量相加为例 使用tvm的流程是 1 描述串行的向量相加是怎么做的 2 描述并行的时候 怎么对计算单元做划分 3 编译目标函数 本文所示代码可以看到用tvm生成的cuda代码 4 把编译生成的内容保存成文件 加
  • VMware Workstation 未能启动 VMware Authorization Service。您可以尝试手动启动 VMware Authorization Service。如果此问题仍然存

    报错界面 解决方法一 管理员身份运行即可 解决方法二 打开服务 找到VMware Authorization Service右键选择然后点启动 然后发现又报了下面的错误 不慌这时候打开属性把启动类型改成手动即可
  • String、StringBuffer和StringBuilder的异同点

    String StringBuffer StringBuilder三者的异同 String 不可变的字符序列 底层使用char 存储 StringBuffer 可变的字符序列 线程安全的 效率低 底层使用char 存储 StringBuil
  • OpenAI的人工智能语音识别模型Whisper详解及使用

    1 whisper介绍 拥有ChatGPT语言模型的OpenAI公司 开源了 Whisper 自动语音识别系统 OpenAI 强调 Whisper 的语音识别能力已达到人类水准 Whisper是一个通用的语音识别模型 它使用了大量的多语言和
  • 安装mingw出现download failed和unable to continue

    利用mingw get setup安装mingw总是出现download failed和unable to continue错误 截图如下 错误原因 因为服务器在外网 可能是对方服务器不稳定 连接出错等问题导致 解决办法 下载对应等离线安装
  • 11信号学习之sigaction函数及使用其实现信号捕捉案例(信号最重要的一节)

    概述 注意 在我关于信号的文章中 我所说的系统的mask的意思实际上是进程的mask 每个进程的mask都是唯一的 所以我就将其称为系统的 但不能理解为每个进程的mask都是共用的 1 sigaction函数 1 上一篇我们说的signal
  • 基于STM32的DMX512开发

    首先基本了解一下DMX512的基本协议 一 DMX512协议 DMX 是Digital MultipleX 的缩写 意为多路数字传输 DMX512控制协议是美国舞台灯光协会 usITT 于1990年发布的灯光控制器与灯具设备进行数据传输的工
  • 复习使用git(二)

    删除远程分支 git push origin delete 分支名 撤销修改 撤销工作区的修改 已修改 但尚未添加 add 使用 git restore 文件名 撤销工作区的修改 Note git checkout 文件名 checkout
  • 基于STM32F407的SDCard读写操作及USB挂载(HAL库)

    基于STM32F407的SDCard读写操作及USB挂载 HAL库 本来在上一篇SD卡读写也都OK了 后来想着挂载SD卡做U盘 就去查了下资料 结果基本全是HAL库的 原来没用过HAL库 于是本着好奇的心态去下了 说实话 确实看起来简单多了
  • 【Spring Boot】——集成JSON工具

    前言 json是现在非常流程的数据交换格式 所以对于被开发人员来说如何更好了解java对象和json格式之间的转换是至关重要的 接下来我们来好好说一说 一 什么是JSON 摘自百度百科 JSON JavaScript Object Nota
  • android 涨潮动画加载_潮汐apk客户端-潮汐android最新版APP下载v2.0.1.1 免费版-腾牛安卓网...

    潮汐一个非常有特色的静心平台 它可以让你在工作困乏时聆听几分钟就可以更加高效的工作 让你的工作效率达到更好的专注 它可以让你的心情更加温和 让你的每一天不再那么浮躁和枯燥无味 让你的心情越来越舒畅 喜欢的朋友快来腾牛网下载吧 软件特色 保持
  • Linux实验报告【全集】

    若对你有帮助 记得点赞 关注我哦 实验目录 Linux常用命令 linux下的shell编程 Linux下的c编程 Linux下的API编程 每个实验的图片都比较多 一开始实验基本都是书上的例题 后面会变难 做实验时往往会想 为什么每届都做
  • 开发环境配置:服务器训练模型工具tmux基础使用

    开发环境配置 服务器训练模型工具tmux基础使用 1 tumx可以做什么 2 Ubuntu安装tmux 3 常用命令 3 1 新建会话并进入 3 2 退出会话 3 3 查看存在的会话 3 4 重新进入会话 3 5 销毁会话 1 tumx可以
  • C#检测是否在单元测试环境

    true则为单元测试环境下 false不是 bool unitTest System Environment StackTrace IndexOf NUnit Framework StringComparison CurrentCultur
  • ShareSDK集成第三方登录和分享的步骤

    转自 http my oschina net u 1024921 blog 170588 之前用过这个几次了 而每次都没有记录一下具体的步骤 这次就写一下吧 1 去ShareSDK下载官方的SDK 2 现在他们的服务特别人性化 解压SDK之
  • SiamFC:利用全卷积孪生网络进行视频跟踪

    目录 论文下载地址 代码下载地址 论文作者 模型讲解 模型结构 模型输入 损失函数 训练过程 结果分析 传送门 论文下载地址 SiamFC论文地址 SiamFC论文百度网盘下载地址 提取码 7309 SiamFC论文翻译 水印 百度网盘下载
  • Python-logging详解(彩色日志扩展,多进程安全等)

    目录 简介 日志级别 记录器 处理器 格式器 多线程与多进程安全 代码 导入及全局变量 函数 实验及结果 参考 简介 日志是工程中不可缺少的一部分 国家等保2 0也规定 至少保留日志180天 对于程序员来说 日志也方便进行记录及排错 log
  • 算法10——c++实现中缀表达式计算

    题目描述 读入一个只包含 x 的非负整数计算表达式 计算该表达式的值 输入格式 测试输入包含若干测试用例 每个测试用例占一行 每行不超过200个字符 整数和运算符之间用一个空格分隔 没有非法表达式 当一行中只有0时输入结束 相应的结果不用输
  • c 语言 成员变量模板,C++类模板与模板类深入详解

    1 在c 的Template中很多地方都用到了typename与class这两个关键字 而且有时候二者可以替换 那么是不是这两个关键字完全一样呢 事实上class用于定义类 在模板引入c 后 最初定义模板的方法为 template 这里cl
  • 通过字节码深入了解创建对象的过程

    package shixun test public class Test2643 public static void main String args Person person new Person class Tag int i p