java创建对象的过程详解
首先,介绍一下java中对象的创建基本知识然后,介绍一下对象初始化的顺序接下来,介绍一下创建对象的几种方式最后,进行一个总结。(从内存角度去分析:重点)重点
一、基本知识
我们知道,一个对象的创建过程包含两个过程:初始化和实例化
我们在使用一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完成类的初始化。在类初始化过程中或初始化完毕后,根据具体情况才会去对类进行实例化。
实例化时候,java虚拟机就会为其分配内存来存放自己及其从父类继承过来的实例变量。在为这些实例变量分配内存的同时,这些实例变量先会被赋予默认值(零值)。在内存分配完成之后,Java虚拟机才会对新创建的对象赋予我们程序员给定的值。
小结:创建一个对象包含下面两个过程:
1、类构造器完成类初始化(分配内存、赋予默认值)
2、类实例化(赋予给定值)
二、类初始化
下面我们直接给出一个例子看一下java是如何初始化的。我们知道一个类中,往往包含静态变量、静态代码块、变量、普通方法、构造方法等信息。那么他们是如何初始化的呢?
输出:
上面这个例子比较简单,我们再来看看带有父类和接口的情况。
第一步:定义一个父类
第二步:定义一个子类实现
第三步:看结果
小结,类的初始化顺序,这样看确实不好记,不过没有继承关系的我们都能很好的看到。带继承关系的,使用网上一张图来表示:
OK,类的初始化中的知识点基本上就是初始化的顺序。
三、创建对象的几种方式
其实对象的初始化就是在创建对象的时候由jvm完成的。对于创建对象,主要是研究创建对象的几种方式。下面一一的解答.这里给出6种方式,面试的时候足够你zhuangbility。
- 使用new关键字
- Class对象的newInstance()方法
- 构造函数对象的newInstance()方法
- 对象反序列化
- Object对象的clone()方法
- 使用Unsafe类创建对象
最后再揭晓。。。OK,先认识一个,下面一个一个看。
(1)使用new关键字
(2)class的newInstance()方法
首先我们通过Class.forName()动态的加载类的Class对象,
然后通过newInstance()方法获得Test类的对象
(3)构造函数的newInstance()方法
类Constructor也有newInstance方法,这一点和Class有点像。从它的名字可以看出它与Class的不同,Class是通过类来创建对象,而Constructor则是通过构造器。
(4)序列化
首先我们要对Test实现Serializable接口。然后开始序列化数据。最后得到反序列化的对象。
(5)clone方式
Object对象中存在clone方法,它的作用是创建一个对象的副本。
(6)使用Unsafe类创建对象
Unsafe类使Java拥有了像C语言的指针一样操作内存空间的能力,同时也带来了指针的问题。过度的使用Unsafe类会使得出错的几率变大,因此Java官方并不建议使用的,官方文档也几乎没有。Oracle正在计划从Java 9中去掉Unsafe类,如果真是如此影响就太大了。
我们无法直接创建Unsafe对象。这里我们使用反射方法得到
拿到这个对象后,调用其中的native方法allocateInstance 创建一个对象实例
Object event = unsafe.allocateInstance(Test.class);
四、总结
我们想要创建一个对象。基本上就是java虚拟机分配内存的过程。因此我们可以先回顾一下java程序的执行过程。给一张网上的图,写的很清晰
一个例子去解释:
然后我们测试一下:
我们分析一下这个过程:
第一步,JVM去方法区寻找Test类的代码信息,如果有直接调用,没有的话使用类的加载机制把类加载进来。同时把静态变量、静态方法、常量加载进来。这里加载的是(“冯冬冬的IT技术栈”,“冯XX”);这是因为字符串是常量,age中的18是基本类型。
第二步,jvm进入main方法,看到Person person=new Person()。首先分析Person这个类,同样的寻找Person类的代码信息,有就加载,没有的话类加载机制加载进来。同时也加载静态变量、静态方法、常量(“我正在走路。。。”)
第三步,jvm接下来看到了person,person在main方法内部,因而是局部变量,存放在栈空间中。
第四步,jvm接下来看到了new Person()。new出的对象(实例),存放在堆空间中。
第五步,jvm接下来看到了“=”,把new Person的地址告诉person变量,person通过四字节的地址(十六进制),引用该实例。 是不是有点晕,别着急,画个图看一下。
第六步,jvm看到person.name = “冯冬冬的IT技术栈”;person通过引用new Person实例的name属性,该name属性通过地址指向常量池的"冯冬冬的IT技术栈"。
第七步,jvm看到person.age = 18; person的age属性是基本数据类型,直接赋值。
第八步,jvm看到person.walk(); 调用实例的方法时,并不会在实例对象中生成一个新的方法,而是通过地址指向方法区中类信息的方法。走到这一步再看看图怎么变化的
大多数人基本上都能看懂。创建一个对象的过程基本上就是这。
java创建对象的过程详解相关推荐
- 深入理解Java虚拟机之Java类加载机制,Java类实例化过程详解。
目录 Java类加载机制 类加载过程 加载(Loading) 连接(Linking) 初始化(Initialzation) 使用(Useing) 卸载(Unloading) 引言 什么情况下开始类加载 ...
- 最通俗易懂的JAVA虚拟机类加载过程详解,看完还不懂你考虑转行吧!
前言 当程序使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载.链接.初始化三个步骤对该类进行类加载. Java Class文件 class文件是一组以8位字节为基础的二进制流,各个数据项目 ...
- java mfcc_MFCC特征提取过程详解
一.MFCC概述 在语音识别(Speech Recognition)和话者识别(Speaker Recognition)方面,最常用到的语音特征就是梅尔倒谱系数(Mel-scale Frequency ...
- Java类的加载过程详解 面试高频!!!值得收藏!!!
受多种情况的影响,又开始看JVM 方面的知识. 1.Java 实在过于内卷,没法不往深了学. 2.面试题问的多,被迫学习. 3.纯粹的好奇. 很喜欢一句话: 八小时内谋生活,八小时外谋发展. 望别日与 ...
- Java web 开发的概念、环境配置、创建项目过程详解(Eclipse)
Java Web 开发 Java Web 开发概念 搭建过程 详解 在eclipse创建Dynamic Web Project 创建时选择Tomcat的版本 创建项目成功 eclipse环境下如何配置 ...
- Java单机部署,Nacos docker单机模式部署实现过程详解
Nacos 的部署,我使用的时docker 部署(单机模式 mysql),官网文档:https://nacos.io/zh-cn/docs/quick-start-docker.html 拉取代码: ...
- java判断或_Java判断用户名和密码是否符合要求过程详解
这篇文章主要介绍了Java判断用户名和密码过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 假设在某仓库管理系统的登录界面中需要输入用户名和密 ...
- java压缩文件详解_Java解压和压缩带密码的zip文件过程详解
前言 JDK自带的ZIP操作接口(java.util.zip包,请参看文章末尾的博客链接)并不支持密码,甚至也不支持中文文件名. 为了解决ZIP压缩文件的密码问题,在网上搜索良久,终于找到了winzi ...
- java spring bean配置文件_Spring基于xml文件配置Bean过程详解
这篇文章主要介绍了spring基于xml文件配置Bean过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 通过全类名来配置: class:be ...
最新文章
- 更别致的词向量模型(一):simpler glove
- 向日葵远程使用备忘录
- linux安全软件 腾讯,腾讯安全团队发现一存在24年的Linux 0day高危漏洞
- 【JS 逆向百例】cnki 学术翻译 AES 加密分析
- Spring Boot—07应用application.properties中的配置
- daoi php_聊聊这些年用过的AOI
- ros melodic 版本sudo rosdep init和rosdep upgrade失败的解决办法
- 物体检测方法总结(下)
- Android 应用开发(9)---内联复杂的XML资源
- Python的第三方库xlrd
- Gaze Estimation学习笔记(1)-Appearance-Based Gaze Estimation in the Wild
- 算法:剑指 Offer 06. 从尾到头打印链表
- 怎样下载安装Firebug和使用Firebug
- excel汇总软件如何快速汇总多个表格数据
- Mysql各种缩写含义
- Kafka系列之:增加Kafka节点扩展Kafka集群
- math_角函数反三角函数诱导公式三角/反三角恒等式
- 百度大脑人体分析服务3月上新盘点
- word标题为第一章,将图题由图一.1设置题注为图1.1的取巧方法
- 千子晨婚纱摄影 vs 绝色摄影
热门文章
- 定义商品类Goods 并进行封装
- 小米2+android版本,小米2/2S Android 4.4.2刷机详细教程
- 没有躲过的坑--有if就要有else(一定成对)
- vue的form表单在提交成功后置空
- IM即时通讯工具可以这样个性定制
- python字符宽度_使用vars或\uyu dict的Python固定宽度字符串格式__
- MySQL 5.7 OCP考试大纲
- SpringMVC整合websocket实现消息推送及触发
- 安装CentOS 5.x与多重引导小技巧(鸟哥的Linux私房菜 基础篇)
- 低压差线性稳压器(LDO)设计与仿真