dw中创建java程序_Java创建对象的过程简介
Java创建对象的过程
简单记录一下Java创建对象的过程,就是new一个对象的时候发生了哪些事情。Java程序执行的过程在此不作说明,对象的创建过程只是程序执行过程的一部分。有关整个程序执行的过程,等熟悉了虚拟机之后在作说明。
对象创建过程简述
Java中对象的创建就是在堆上分配内存空间的过程,此处说的对象创建仅限于new关键字创建的普通Java对象,不包括数组对象的创建。
大致过程如下:
检测类是否被加载
为对象分配内存
为分配的内存空间初始化零值
对对象进行其他设置
执行init方法
检测类是否被加载
当虚拟机执行到new时,会先去常量池中查找这个类的符号引用。如果能找到符号引用,说明此类已经被加载到方法区(方法区存储虚拟机已经加载的类的信息),可以继续执行;如果找不到符号引用,就会使用类加载器执行类的加载过程,类加载完成后继续执行。
为对象分配内存
类加载完成以后,虚拟机就开始为对象分配内存,此时所需内存的大小就已经确定了。只需要在堆上分配所需要的内存即可。
具体的分配内存有两种情况:第一种情况是内存空间绝对规整,第二种情况是内存空间是不连续的。
对于内存绝对规整的情况相对简单一些,虚拟机只需要在被占用的内存和可用空间之间移动指针即可,这种方式被称为指针碰撞。
对于内存不规整的情况稍微复杂一点,这时候虚拟机需要维护一个列表,来记录哪些内存是可用的。分配内存的时候需要找到一个可用的内存空间,然后在列表上记录下已被分配,这种方式成为空闲列表。
分配内存的时候也需要考虑线程安全问题,有两种解决方案:
第一种是采用同步的办法,使用CAS来保证操作的原子性。
另一种是每个线程分配内存都在自己的空间内进行,即是每个线程都在堆中预先分配一小块内存,称为本地线程分配缓冲(TLAB),分配内存的时候再TLAB上分配,互不干扰。
为分配的内存空间初始化零值
对象的内存分配完成后,还需要将对象的内存空间都初始化为零值,这样能保证对象即使没有赋初值,也可以直接使用。
对对象进行其他设置
分配完内存空间,初始化零值之后,虚拟机还需要对对象进行其他必要的设置,设置的地方都在对象头中,包括这个对象所属的类,类的元数据信息,对象的hashcode,GC分代年龄等信息。
执行init方法
执行完上面的步骤之后,在虚拟机里这个对象就算创建成功了,但是对于Java程序来说还需要执行init方法才算真正的创建完成,因为这个时候对象只是被初始化零值了,还没有真正的去根据程序中的代码分配初始值,调用了init方法之后,这个对象才真正能使用。
到此为止一个对象就产生了,这就是new关键字创建对象的过程。过程如下:
检测类是否被加载–>为对象分配内存空间–>初始零值–>进行必要的设置–>调用init方法进行初始化。
dw中创建java程序_Java创建对象的过程简介相关推荐
- 【开发环境】Android 命令行中执行 Java 程序 ( IntelliJ IDEA 中创建 Java / Kotlin 工程 | dx 打包 DEX 字节码文件 | dalvikvm 命令 )
文章目录 前言 一.IntelliJ IDEA 中创建 Java / Kotlin 工程 二.准备 Java 和 Kotlin 代码 三.编译在 PC 上可执行的 Java / Kotlin JAR ...
- 在Android Studio中运行Java程序
在Android Studio中运行Java程序 有时候在开发Android时,由于调试需要,需要写一些Java程序. 由于类库引用等问题,去IntelliJ IDEA新建一个Java程序还要添加类库 ...
- 在Eclipse中导入Java程序
在Eclipse中导入Java程序 在 Eclipse 中导入 Java 程序 在 Eclipse 中导入 Java 程序,分导入Java Project和导入Java源程序 两种情况,简述如下. 情 ...
- java编译程序的基本命令是什么,【填空题】Java中编译java 程序的命令是 1 ,执行java程序的命令是 java 。...
[填空题]Java中编译java 程序的命令是 1 ,执行java程序的命令是 java . 更多相关问题 [多选] 下列骨折中属于关节外骨折的是(). [多选] 骨折早期局部的并发症包括(). [多 ...
- 如何在C++中嵌入JAVA程序
如何在C++中嵌入JAVA程序呢?现在的程序员,不再像以前一样,掌握一种编程语言就可以混得有模有样了,这里为大家讲的,就是C++与Java混合编程.局域网聊天软件举几个简单的例子,一个软件为了快速开发 ...
- 编写1个JSP页面,在JSP页面中使用Java程序片输出26个小写的英文字母表。
编写1个JSP页面,在JSP页面中使用Java程序片输出26个小写的英文字母表. <%@ page language="java" contentType="tex ...
- 在VScode中创建Java项目
在VScode中创建Java项目 1. 配置SDK环境 2.在vscode中下载Java插件 之前使用过idea或者其他IDE编写Java已经下载并配置好了sdk,可以直接跳转到第二步.没有配置过sd ...
- 在CMD中运行java程序
在CMD中运行java程序 运行原理 实际操作 不在项目下的.java运行 在项目下的.java运行 注意事项 运行原理 运行一个编写好的java文件需要两步,第一步是讲我们的.java文件通过jav ...
- 怎么在eclipse中调试java程序?
怎么在eclipse中调试java程序?关于这个问题我已经回答过很多次,但许多朋友可能还没有理解,本篇文章再来详细为大家解答一下怎么在eclipse中调试java程序?等相关问题,希望对大家有所帮助. ...
- 【Android 逆向】使用 Python 代码解析 ELF 文件 ( PyCharm 中创建 Python 程序 | 导入 ELFFile 库 | 解析 ELF 文件 )
文章目录 一.PyCharm 中创建 Python 程序 二.导入 ELFFile 依赖库 三. 解析 ELF 文件 四. 博客源码 一.PyCharm 中创建 Python 程序 在 PyCharm ...
最新文章
- 10 个免费的 C/C++ 集成开发环境
- cad怎么查找未闭合_CAD无法填充的这四种方法肯定能解你燃眉之急
- react组件设计原则_React组件设计规则
- Android UI开发第三十三篇——Navigation Drawer For Android API 7
- 3.Hadoop的学习(ubuntu安装配置jdk)
- ASP.NETCore编程实现基本认证
- CSS每日学习笔记(0)
- Visual Studio 2012资源管理器里单击打开改为双击打开文件
- 推荐一个比吴恩达的还要优质的机器学习课程
- 最近做了个【51单片机积木式图形化中文编程软件/c语言代码生成器/电路仿真】
- 前后端鉴权之session-cookie
- java读properties配置文件中的值
- Arch报错日志ACPI BIOS Error (bug): Failure creating named object“INFO: task kworker/2:1H:107 blocked“
- 修改putty的缺省值设置
- android 手机投屏电视,手机投屏到智能电视上的几种方法
- 计算机科学中的递归算法是把问题,从计算思维的视角辨析算法中的递归与迭代...
- 给文火慢炖的“少儿美术”加点料
- hping3的简单介绍(新手向,大佬勿喷)
- 【AAAI 2021】多出口架构的知识蒸馏:Harmonized Dense Knowledge Distillation Training for Multi-Exit Architectures
- 超越云存储,用一勺蛋白质保存整个图书馆