【Java 基础】-- 实例化

news2024/9/22 18:31:26

1、定义

    创建对象的过程就叫实例化。这个过程中会在堆中开辟内存,将一些非静态的方法,变量存放在里面。在程序执行的过程中,可以创建多个对象,既多次实例化。每次实例化都会开辟一块新的内存。

2、实例化的几种方法

  1. new 关键字创建
    1. 通过 new 关键字调用类构造器创建对象;
    2. 调用对象的 getXXXInstance 方法(单例模式/建造者模式);
    3. XXXBuilder/ XXXFactory。
  2. 反射:Class的 newInstance 方法或者 Constructor 的 newInstance 方法
  3. 使用类的 clone 方法
  4. 使用反序列化(deserialization)
  5. 第三方库 Objenesis

3、Java 类的生命周期

      Java 类的生命周期是指一个 class 文件从加载到卸载的全过程,类的完整生命周期包括七个部分:加载——验证——准备——解析——初始化——使用——卸载。

     PS:对象的生命周期请参考:Java对象的生命周期 - 简书

      

4、Java 类加载过程

  1. 加载:加载过程就是把class字节码文件载入到虚拟机中,至于从哪儿加载,虚拟机设计者并没有限定,你可以从文件、压缩包、网络、数据库等等地方加载class字节码。
    1. 通过类的全限定名来获取定义此类的二进制字节流
    2. 将此二进制字节流所代表的静态存储结构转化成方法区的运行时数据结构
    3. 在内存中生成代表此类的java.lang.Class对象,作为该类访问入口.
  2. 验证:验证的目的是确保class文件的字节流中信息符合虚拟机的要求,不会危害虚拟机安全,使得虚拟机免受恶意代码的攻击,这一步至关重要。
    1. 文件格式验证
    2. 源数据验证
    3. 字节码验证
    4. 符号引用验证
  3. 准备:准备阶段的工作就是为类的静态变量分配内存并设为jvm默认的初值,对于非静态的变量,则不会为它们分配内存。静态变量的初值为jvm默认的初值,而不是我们在程序中设定的初值。(仅包含类变量,不包含实例变量).  
  4. 解析:虚拟机将常量池中的符号引用替换为直接引用,解析动作主要针对类或接口,字段,类方法,方法类型等等。
  5. 初始化:在该阶段,才真正意义上的开始执行类中定义的java程序代码,该阶段会执行类构造器,并且在Java虚拟机规范中有明确的规定,在下面5种情况下必须对类进行初始化:
    1. 遇到new、getstatic、putstatic、invokestatic这4条字节码指令时,如果类没有进行过初始化,则需要先触发其初始化。
    2. 使用java.long.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。
    3. 当初始化一个类的时候,如果发现其父类没有进行过初始化,则需要先触发其父类的初始化。
    4. 当虚拟机启动时,需要制定一个执行的主类(即main方法的类),虚拟机必须先初始化这个类。
    5. 使用动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后解析结果是REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄对应的类没有进行初始化,则需要先触发其初始化。
  6. 使用:使用该类所提供的功能,其中包括主动引用和被动引用。
    1. 主动引用:
      1. 通过new关键字实例化对象、读取或设置类的静态变量、调用类的静态方法。
      2. 通过反射方式执行以上三种行为。
      3. 初始化子类的时候,会触发父类的初始化。
      4. 作为程序入口直接运行时(也就是直接调用main方法)。
    2. 被动引用:
      1. 引用父类的静态字段,只会引起父类的初始化,而不会引起子类的初始化。
      2. 定义类数组,不会引起类的初始化。
      3. 引用类的常量,不会引起类的初始化。
  7. 卸载:从内存中释放,在我之前写的垃圾回收机制(GC)总结一文中有介绍到方法区内存回收中对类的回收条件,这里再贴出来一下:
    1. 该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例;
    2. 加载该类的ClassLoader已经被回收;
    3. 该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

5、小结

        Java 的对象基本上都是在 jvm 的堆区中创建,在创建对象之前,会触发类加载(加载、连接、初始化),当类初始化完成后,根据类信息在堆区中实例化类对象,初始化非静态变量、非静态代码以及默认构造方法,当对象使用完之后会在合适的时候被jvm垃圾收集器回收。

       PS:对象的生命周期只是类的生命周期中使用阶段的主动引用的一种情况(即实例化类对象),而类的整个生命周期则要比对象的生命周期长的多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1353823.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32学习笔记十七:WS2812制作像素游戏屏-飞行射击游戏(7)探索动画之故事板,复杂动画

要让物体沿着路径移动,必须同时修改X/Y两个值,用两个连续插值动画行不行? 在单片机这种单线程设备,两个TICK会前后脚进行修改,具有相同的时间跨度,所以似乎也是可以的。但是在支持多线程的设备&#xff0c…

【CVPR2023】使用轻量 ToF 传感器的单目密集SLAM的多模态神经辐射场

目录 导读 本文贡献 本文方法 轻量级ToF传感器的感知原理 多模态隐式场景表示 时间滤波技术 实验 实验结果 消融实验 结论 未来工作 论文标题:Multi-Modal Neural Radiance Field for Monocular Dense SLAM with a Light-Weight ToF Sensor 论文链接&am…

Java程序设计阶段测试1

一、单选题(共15题; 共30.0分) 2.0分 1、以下哪个是Java应用程序main方法的有效定义? A.public static void main(); B.public static void main( String args ); C.public static void main( String args[] ); D.public static boolea…

交换机02_共享式交换式

1、共享式网络 早期的以太网是共享式网络,它是由集线器(HUB)相连,由一个HUB相连了两台主机,形成一个冲突域也称广播域。 (1)相关名词解释 集线器 HUB中心的意思,集线器就是对接收…

VINS-MONO拓展1----手写后端求解器,LM3种阻尼因子策略,DogLeg,构建Hessian矩阵

文章目录 0. 目标及思路1. 非线性优化求解器2. 基于VINS-MONO的Marginalization框架构建Hessian矩阵2.1 estimator.cpp移植2.2 solve.cpp/preMakeHessian()2.3 solve.cpp/makeHessian() 3. solve.cpp/solveLinearSystem()求解正规方程4. 更新状态5. 迭代求解6. EVO评估结果7. 待…

drf知识--10

接口文档 # 后端把接口写好后: 登录接口:/api/v1/login ---> post---name pwd 注册接口 查询所有图书带过滤接口 # 前后端需要做对接,对接第一个东西就是这个接口文档,前端照着接口文档开发 公司3个人&#xff…

LaTeX语法、工具及模板大全(持续更新ing...)

诸神缄默不语-个人CSDN博文目录 我之前把Markdown和LaTeX的语法写在一个博文里了,但是现在感觉还是应该拆开来比较合适,因为LaTeX太复杂了…… LaTex核心其实是套模板,但是为了套好模版,也需要学习一些具体的语法。 文章目录 1.…

14 简约登录页

效果演示 实现了一个简单的登录表单的样式,包括背景颜色、边框、字体颜色、字体大小、字体粗细、输入框样式、提交按钮样式等。当用户在输入框中输入内容时,输入框下方的提示文字会动态地变化,以提示用户输入正确的信息。当用户点击提交按钮时…

广播及代码实现

广播(Broadcast)是一种网络通信方式,它允许一台设备向网络中的所有其他设备发送消息。广播通常用于在网络上传递一些信息,让所有设备都能接收并处理。在广播中,通信的目标是整个网络而不是特定的单个设备。 向子网中…

电风扇目标检测数据集VOC格式1100张

电风扇的全方位介绍 一、功能特性 电风扇作为一种晋及化的家用电器,其主要功能是利用电机驱动扇叶旋转,从而产生风力,用干调节室内空气流通,达至降温、通风和改善室内环境的目的。此外,现代电风扇还具备定时、遥控、…

踩坑记录-安装nuxt3报错:Error: Failed to download template from registry: fetch failed;

报错复现 安装nuxt3报错:Error: Failed to download template from registry: fetch failednpx nuxi init nuxt-demo 初始化nuxt 项目 报错 Error: Failed to download template from registry: fetch faile 解决方法 配置hosts Mac电脑:/etc/hostswin电…

vue本地打包预览

1、项目打包 npm run build2、安装serve npm install -g serve3、在项目的 dist 文件运行命令行 serve 4、运行如下在浏览器打开即可

游戏用代理IP怎么检查是否有效?哪些因素会影响代理IP的质量?

随着网络游戏的普及,越来越多的玩家选择使用代理IP来提升游戏体验。然而,在使用代理IP的过程中,玩家们可能会遇到一些问题,其中最关键的就是如何检查代理IP是否有效以及哪些因素会影响代理IP的质量。本文将详细介绍这些问题&#…

R306指纹识别模块功能实现示例

1 基本通信流程 1.1 UART 命令包的处理过程 1.2 UART 数据包的发送过程 UART 传输数据包前,首先要接收到传输数据包的指令包,做好传输准备后发送成功应答包,最后才开始传输数据包。数据包主要包括:包头、设备地址、包标识、包长…

2024年【浙江省安全员-C证】模拟考试及浙江省安全员-C证证考试

题库来源:安全生产模拟考试一点通公众号小程序 浙江省安全员-C证模拟考试是安全生产模拟考试一点通生成的,浙江省安全员-C证证模拟考试题库是根据浙江省安全员-C证最新版教材汇编出浙江省安全员-C证仿真模拟考试。2024年【浙江省安全员-C证】模拟考试及…

Jenkins持续集成(上篇)

(一)持续集成与 Jenkins 介绍 持续集成 持续集成(Continuous integration,简称 CI),随着近几年的发展,持续集成在项目中得到了广泛的推广和应用。本章将带领读者一起了解持续集成工具 Jenkins…

jdk和IDEA教育版下载和安装详解

前言 研究生专业是通信系统,为了寻找实习于是在研二时期学习java。但是在学习java的过程中没有进行系统总结,很多知识点或者一些细节已经忘记。由于工作找的是某行软件中心的软件开发。准备在毕业前对java知识进行系统性学习。本专栏将从零基础开始,从最简单的jdk和IDEA下载…

阿赵UE学习笔记——6、免费资源获取

阿赵UE学习笔记目录 大家好,我是阿赵。   接下来准备要往UE引擎里面放美术资源了。美术资源可以自己做,不过也有一些免费的资源可以供我们使用的,这里介绍一些获得免费美术资源的方法。 一、Quixel 1、Quixel网站下载 Quixel资源库&#…

高效管理版本控制,Cornerstone 4 for Mac助您成为SVN专家

在软件开发和团队合作中,版本控制是一个至关重要的环节。为了帮助开发者更加高效地管理和控制代码版本,Cornerstone 4 for Mac应运而生。作为一款功能强大的SVN(Subversion)管理工具,Cornerstone 4 for Mac为Mac用户提…

动手学深度学习一:环境安装与数据学习

2024,重新开始深度学习。 第一步:李沐动手学深度学习 课程网址:https://courses.d2l.ai/zh-v2/ 包含教材和视频网址链接 Jupyter notebook安装 目前在本地先使用cpu版本pytorch,我的本地已经安装好conda,跟着教材创建…