Java类的初始化和实例化(面试踩坑学习与记录)

背景

疫情期间,公司半年没发工资了,不得已选择了辞职,休息了一阵子,开始找工作。没有优秀的学历,也没有优秀的背景履历,加上现在企业也不好做,疫情的影响导致现在形成了卖方市场,这期间的求职之路还真是举步维艰啊,能做的只能是一步一个脚印,踏实学习,摆脱了加班以及业务的催促,也趁这期间好好沉淀自己,相信没有迈不过去的坎儿,会好的。

从今天开始如果有面试,有被问到不会的或者答的不好的问题,我会在此记录下来,算是一次回顾学习与总结,同时也是对自己的鞭策,找到自己的弱项,针对其进行提升。

java类的初始化

1.完成程序执行前的准备工作。
2.在这期间,静态方法,变量,代码块会被执行,同时在会开辟一块存储空间用来存放静态的数据。
3.初始化只在类加载的时候执行一次

java类的实例化

1.创建一个对象的过程。
new或者Class.newInstance()
2.这期间中会在堆中开辟内存,将一些非静态的方法,变量存放在里面。
3.在程序执行的过程中,可以创建多个对象,既多次实例化
4.每次实例化都会开辟一块新的内存。

java类的加载过程

加载
通过类名获取类的二进制字节流是通过类加载器(ClassLoader)来完成的。其加载过程使用“双亲委派模型”。(双亲委派模型:当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类。使用双亲委派模型是为了保证Class文件的安全,不被篡改,同事也可保证Class类是唯一的,不会重复加载)
验证
当一个类被加载之后,必须要验证一下这个类是否合法,比如这个类是不是符合字节码的格式、变量与方法是不是有重复、数据类型是不是有效、继承与实现是否合乎标准等等。总之,这个阶段的目的就是保证加载的类是能够被jvm所运行。
准备
为类变量(静态变量)在方法区分配内存,并设置零值。注意:这里是类变量,不是实例变量,实例变量是对象分配到堆内存时根据运行时动态生成的。
解析
把常量池中的符号引用解析为直接引用:根据符号引用所作的描述,在内存中找到符合描述的目标并把目标指针指针返回。
初始化
类的初始化过程是这样的:按照顺序自上而下运行类中的变量赋值语句和静态语句,如果有父类,则首先按照顺序运行父类中的变量赋值语句和静态语句在类的初始化阶段,只会初始化与类相关的静态赋值语句和静态语句,也就是有static关键字修饰的信息,而没有static修饰的赋值语句和执行语句在实例化对象的时候才会运行。执行clinit()方法(clinit是class initialize的简写)
实例化
在堆区分配内存空间,执行实例对象初始化,设置引用变量a指向刚分配的内存地址

总结

这次面试考官主考了java的基本知识,上述的东西其实都是我们日常用的熟的不能再熟的东西,可是在陈述的时候实例化和初始化我答的并不好,在此记录,以此鞭策,共勉大家。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章