java基础代码实例_基础篇:详解JAVA对象实例化过程

1 对象的实例化过程

  • 对象的实例化过程是分成两部分:类的加载初始化,对象的初始化
  • 要创建类的对象实例需要先加载并初始化该类,main方法所在的类需要先加载和初始化
  • 类初始化就是执行方法,对象实例化是执行方法
  • 一个子类要初始化需要先初始化父类

2 类的加载过程

8ca7c098a498a49456c567bb6ce05563.png
  • 类的加载机制:如果没有相应类的class,则加载class到方法区。对应着加载->验证->准备->解析-->初始化阶段 加载:载入class对象,不一定是从class文件获取,可以是jar包,或者动态生成的class验证:校验class字节流是否符合当前jvm规范准备:为类变量分配内存并设置变量的初始值(默认值)。如果是final修饰的对象则是赋值声明值解析:将常量池的符号引用替换为直接引用初始化:执行类构造器(注意不是对象构造器),为类变量赋值,执行静态代码块。jvm会保证子类的执行之前,父类的先执行完毕
  • 其中验证、准备、解析3个部分称为 连接
  • 方法由静态变量赋值代码和静态代码块组成;先执行类静态变量显示赋值代码,再到静态代码块代码

3 触发类加载的条件

  • 第一次创建类的新对象时,会触发类的加载初始化和对象的初始化函数执行,这个是实例初始化,其他6个都是类初始化
  • JVM启动时会先加载初始化包含main方法的类
  • 调用类的静态方法(如执行invokestatic指令)
  • 对类或接口的静态字段执行读写操作(即执行getstatic、putstatic指令);不过final修饰的静态字段的除外(已经赋值,String和基本类型,不包含包装类型),它被初始化为一个编译时常量表达式 注意:操作静态字段时,只有直接定义这个字段的类才会被初始化;如通过其子类来操作父类中定义的静态字段,只会触发父类的初始化而不是子类的初始化
  • 调用JavaAPI中的反射方法时(比调用java.lang.Class中的方法(Class.forName),或者java.lang.reflect包中其他类的方法)
  • 当初始化一个类时,其父类没有初始化,则需先触发父类的初始化(接口例外)

4 对象的实例化过程

  • 对象实例化过程 其实就是执行类构造函数 对应在字节码文件中的()方法(称之为实例构造器);()方法由非静态变量、非静态代码块以及对应的构造器组成 ()方法可以重载多个,类有几个构造器就有几个()方法()方法中的代码执行顺序为:父类变量初始化,父类代码块,父类构造器,子类变量初始化,子类代码块,子类构造器。
  • 静态变量,静态代码块,普通变量,普通代码块,构造器的执行顺序
a81753736063146f0609a8a27b7cdc47.png
  • 具有父类的子类的实例化顺序如下
15a1197bc0111a87288539181c3a858e.png

5 类加载器和双亲委派规则,如何打破双亲委派规则

  • 类加载器 通过一个类的全限定名来获取描述此类的二进制字节流,实现这个动作的代码模块称为类加载器任意一个类都需要其加载器和类本身来确定类在JVM的唯一性;每个类加载器都有自己的类名称空间,同一个类class由不同的加载器加载,则被JVM判断为不同的类
55319f4ec656fe8a6d7353257dbac860.png
  • 双亲委派模型 启动类加载器有C++代码实现,是虚拟机的一部分。负责加载lib下的类库其他的类加载器有java语言实现,独立于JVM,并且继承ClassLoaderextention ClassLoader负责加载libext目录下的类库application ClassLoader 负责加载用户路径下(ClassPath)的代码不同的类加载器加载同一个class文件会导致出现两个类。而java给出解决方法是下层的加载器加委托上级的加载器去加载类,如果父类无法加载(在自己负责的目录找不到对应的类),而交还下层类加载器去加载。如下图
041248362586eb49ba9bc66b21060d33.png
  • 打破双亲委派模型 双亲委派模型并不是一个强制的约束模型,而是java设计者推荐给开发者的类加载实现方式双亲委派模型很好的解决各个类加载基础类的同一问题(越基础的类由越上层的加载器加载),但是基础类总是作为用户代码调用的API,但是如果它的具体实现是下层的代码,此时基础类需要调用下层的代码,则需要打破双亲委派模型如JNDI服务,JNDI的代码有启动类去加载(rt.jar),它需要调用由独立厂商部署在应用程序classpath下的JNDI的SPI(Service Provider Interface)代码。为了解决SPI代码加载问题,java引入了线程上下文类加载器去加载SPI代码。也就是父类加载器请求子类去完成类的加载动作线程上下文类加载器,线程创建时会从父线程继承,如果全局范围没有设置过,则默认设置为application Class Loader


作者:clswcl
链接:https://juejin.im/post/6861940021146943502
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

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

相关文章

搭建webUI自动化及问题解决:Message: ‘chromedriver‘ executable needs to be in PATH.解决办法

搭建webUI自动化环境 1、conda install selenium即可。 若出现:Message: chromedriver executable needs to be in PATH.Please see https://sites.google.com/a/chromium.org/chromedriver/home。 报错原因:没有配置chrome浏览器的chromedriver 解决…

python内置输入函数_python内置函数 print()

英文文档:print(*objects, sep’ ‘, end’\n’, filesys.stdout, flushFalse)Print objects to the text stream file, separated by sep and followed by end. sep, end, file and flush, if present, must be given as keyword arguments.All non-keyword argume…

webUI自动化一元素定位

实现功能:自动在百度输入框输入test,并进行搜索 from selenium import webdriver from time import sleepdriver webdriver.Chrome() driver.get("http://www.baidu.com")input_text driver.find_element_by_id("kw") print(&quo…

python propresql mysql_python数据库操作mysql:pymysql、sqlalchemy常见用法详解

本文实例讲述了python数据库操作mysql:pymysql、sqlalchemy常见用法。分享给大家供大家参考,具体如下:相关内容:使用pymysql直接操作mysql创建表查看表修改表删除表插入数据查看数据修改数据删除数据使用sqlmary操作mysql创建表查…

webUI自动化二-获取元素信息相关方法

from selenium import webdriver from time import sleepdriver webdriver.Chrome() driver.get("D:\QQFile\注册A.html")# 1获取用户输入框的大小 input_text driver.find_element_by_id("userA") print("元素大小为:",input_text…

python环境变量的配置 alias_配置别名

有没有经常敲错命令?比如git status?status这个单词真心不好记。如果敲git st就表示git status那就简单多了,当然这种偷懒的办法我们是极力赞成的。我们只需要敲一行命令,告诉Git,以后st就表示status:$ git…

C语言-字符串处理函数strcpy

strcpy 原型:strcpy(char destination[], const char source[]); 功能:将字符串source拷贝到字符串destination中。此处将source中的字符串结束标志符‘\0’也一同复制。所以在输出时,切不可以用‘\0’,puts,printf输…

pythonjavascript一起开发_Python开发【第十一篇】:JavaScript

JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理。一、如何编写1、JavaScript代码存在形式Js代码内容2、JavaScript代码存放位置HTML的…

C语言-字符串处理函数strcat

strccat-字符串拼接函数 char*strcat(char* strDestination, const char* strSource); 参数说明: strDestination:目的字符串;strSource:源字符串。 strcat() 函数把 strSource 所指向的字符串追加到 strDestination 所指向的字…

js数组截取前5个_我不能没有的5个Vue.js库

1.Click Off to Close有的时候,我们需要在用户点击元素之外的时候触发一个事件。最常见的用例是当你想通过点击关闭一个下拉框或对话框时。这是一个必不可少的包,几乎在我构建的每个应用中都会用到。首选:vue-clickawayhttps://github.com/si…

this.$router.push如何刷新页面_小程序丨微信小程序如何实现页面下拉刷新

微信小程序蕴含着众多功能,本期将简单介绍实现页面下拉刷新的方法,通过阅读本文,读者们可以自行动手操作,在实践中认识微信小程序。首先,我们需在json配置中写出以下配置:"enablePullDownRefresh"…

C语言-字符串处理函数strcmp

strcmp-字符串比较函数 原型:int strcmp(const char firststring[], const char secondstring); 功能:比较两个字符串firststring和secondstring 如果等于 返回值为0 如果字符串1大于字符串2 函数值返回为1 如果字符串1小于字符串2 函数值返回为-1 …

导出excel数字前面的0消失_Excel操作中常见的3大坑你遇到过吗?遇到应该这么解决...

在excel中的我们获取数据的方式一是自己录入数据,二是通过网络或其他的途径导出的源数据,不管哪种的方式,对我们处理数据的来说都十分重要,这里我们需要注意这些点并成功跳过这些不按原理只按自己习惯的坑。今天要聊的坑有3个&…

matplot绘制图形入门

一、折线图 """ File: 折线图.py Author: chde_wang Date: 2021-05-23 22:26:04 Description: """ # 绘制折线图 import numpy as np import matplotlib.pyplot as plt x np.linspace(0, 2 * np.pi, 100) y1, y2 np.si…

kafka使用_Kafka介绍与使用

最近在研究kafka,觉得需要输出点东西才能更好的吸收,遂总结与大家分享,话不多说。一、先上思维导图:二、再上kafka整体架构图:2.1、Producer:消息生产者,就是向kafka broker发消息的客户端。2.2…

int 为什么是2147483647_int范围为啥是-2147483648到2147483647

单位换算 1 Byte(B) 8 bit 1 Kilo Byte(KB) 1024B 1 Mega Byte(MB) 1024 KB 1 Giga Byte (GB) 1024 MB 1 Tera Byte(TB) 1024 GB 1 Peta Byte(PB) 1024 TB 从上可以了解计算机最小的存储单位是bit,即一位二进制数(0 或 1),8个二进制位为一个字…

linux 关闭端口_手把手教你在Linux中快速检测端口的 3 个小技巧

一个执着于技术的公众号前言 无论是要解决网络连接问题还是配置防火墙,第一件事是要检查系统实际打开了哪些端口。本文介绍了几种快速查找 Linux 系统上哪些端口向外部开放的方法。什么是开放端口 监听端口是应用程序监听的网络端口。你要得到的监听端口名单通常可以…

2021-01-12

系统设计-设计思路 定义结构体来保存通讯录中联系人的各项信息 使用主菜单实现对通讯录主要功能的管理,不同功能对应着不同的编号 使用结构体数据来存储多个联系人 采用文件来保存联系人的数据,提高操作效率 系统的数据输入包括输入功能编号以及联系…

2020-11-20

ln -s /bis_data/mysql/tmp/mysql.sock /tmp/ find / -name mysql.sock 2>/dev/null

未能找到程序集“platform.winmd_应用程序崩溃后 微软错误报告工具到底是如何联机检查解决方案的?...

在 Windows 应用意外崩溃后,系统似乎会努力地寻找解决方案。但是在绝大多数情况下,这一切都是徒劳的,并不会向用户给出任何结果。即便如此,很多人还是想要知道这个无效的过程期间到底都发生了什么。好消息是,近日微软 …