00:00
好,那么在讲完我们这个方法区以后啊,那应该说咱们整个呢,关于运行时数据区啊,就算是告一段落了,那正常来说,咱们下边就可以讲这个叫直接内存提一下,然后呢,诶就开始讲这个Java虚拟机,我们讲整个架构的第三部分,第三层就是执行引擎这块了,那么在这个之前呢,我这块给大家插入了一个章节,叫做对象的实例化,或者说呢,叫对象的创建,然后对象的内存布局和访问定位啊这个呢,说的功利一点呢,就是应对呢,大家在开发当中的一些面试题对吧?诶确实呢,有几个大厂呢是出这块的面试题了,诶没有出的呢,其实他也也有可能会被问到,只是没有问而已啊,也是属于大家必须要掌握的一个知识点,那呃,这是我们说功利点来讲,那么这个咱们从这个知识体系上来讲,为什么要加入这样的内容呢?主要原因是这样子的啊,咱们呢,Java语言是面向对象的语言,咱们呢在这个new对象的过程当中,肯定呢,是不是会涉及到我们这个站是吧,堆方法区,这呢也是咱们讲运行时数据区里边最重要的三个结构。那么我们new的这个对象是放在这个对空间当中的,那这个对象的话呢,它所属的这个类型信息呢,是放在方法区啊,那这个呃,如果我们是方法当中的一个局无变量的话呢,它就放在这个占空间,那这三个结构呢,是我们说从各自的这个,呃,这个这个什么具体的内存分配上来讲,是这三块,那如果我们从另外一个维度来讲,就是我们扭了个对象,那这个new的对象呢,怎么把这三块呢,给它粘合在一起的,这就是我们这一节啊想要说明的问题。
01:29
OK啊,那这一节呢,我们就先从这个来源上呢,给大家来说明一下,那么呃,这一章啊,我们主要要讲解的问题呢,其实就是这个标题里边涉及到的关于对象的一个实例化。啊,对象的一个内存布局和对象的一个访问定位,这个呢,大家诶清楚以后,或者说学完以后呢,应该整体上关于我们内存这块就基本上就非常清晰了啊,不管是横向还是纵向啊,关于整个呢,我们这个呃,对象呢,在内存中这个结构呢,应该都是比较透彻了,那等到我们这个下频的时候呢,咱们在中频的时候,咱们到时候呢,再去讲什么呀,关于这个字节码里边具体这个字节码指令啊,操作符这个我们该怎么去看啊,那到那个时候呢,我们关于字节码那这块呢,就更清楚是吧。
02:11
啊,那这个上面呢,咱们能做到就是在内存层面呢,大家呢,就更加的清这个这个清晰,OK,那咱们呢,首先看第一个问题,就是关于这个对象的一个实例化,哎对象实例化,那么在这张里边咱们涉及到的,我这呢就简单的罗列了两个大厂,一个是哎,这个写错了,美团的哈,成了美图的了,美团的,还有呢,这个蚂蚁金服的,呃,对应的这个面试题。啊,对象呢,在Java信息中是怎么存储的,然后对象头的信息里边包含哪些东西啊,蚂蚁金服的二面说Java对象头里边有什么,这呢都是大家学完这一章里边也这个内容之后呢,诶就完全能够非常轻松的应对的这个面试题,好那首先的话呢,我们来看一下关于叫对象的实例化,对象的实例化这块呢,我主要呢想谈两个问题。这呢也是就是完整的这个内容了,呃,第一个问题呢,就是关于对象创建的方式。
03:01
大家呢,也可以回忆一下,你现在呢,肯定都做过Java开发了啊,那么我们有几种方式来创建Java中的对象呢?想一想是吧,然后第二呢,就是创建对象的一个步骤啊,我们这把它分的非常详细,一共呢是六步,OK,那就是这样一个情况,那首先的话呢,我们看第一个啊叫创建对象的这个方式,我这呢,一共罗列出来了,是不是有六种情况。啊,这呢,咱们直接呢,来看一下我这里边画的这个图就行。嗯,看这啊,就是这块呢,讲这个第十章呢,我这块呢,就是这个叫呃脑图了,嗯,脑图呢,这个方式呢,更容易大家清晰的去理解,行,那咱们就一个一个过一下,首先呢,第一个我们称为呢叫创建对象呢,叫做new的方式,这个呢就应该不用我跟任何同学去讲了,这也是咱们是不是最常见的方式,对吧?诶这是一个最常见的方式,就是我们通过new的方式呢去创建对象。哎,New后边呢,加上我们说相应类的这个构造器就可以了,当然这个呢,是为代表的其中的一类啊其中一类那还有其他的什么样情况呢?比如说呃,我们想创建某个类,结果呢,呃,这个类的构造器呢,没有对外暴露啊,那我们呢,比如说像单例模式当中,单类模式当中,我们是不是通过调用当前这个类的,诶叫叉叉叉它的这个静态方法。
04:16
对吧?哎,通过调这个静态方法,然后这个静态方法里边,它实际上呢,实现了对当前这个类的一个呃,这个构造器的一个调用,那这个构造器呢,对于外边呢不暴露,但是它内部呢是暴露出来的,其实还是用的构造器啊,本质上来讲还是属于这个new,但是这呢只是属于一种叫变形,对吧?哎,我这写一下啊,这叫变形变形一吧,那这是一种情况,还有什么样的情况呢?有的时候呢,我们要创建啊,这我写个叫变形二,咱们要创建这个叉叉叉的对象,那这个叉叉叉呢,也没有所谓的静态方法,可以让我们直接返回当前类的对象,然后它的构造器呢,也被私有化了,那我们经常会看到叫叉叉叉的一个叫builder。啊,或者呢,也看到叫叉叉叉的叫factory,大家想想开发当中是不是也遇到过这样的问题,那通过这个叉叉叉build或者是factory呢,它内部呢,又有相应的一些静态方法。
05:12
那通过这个静态方法呢,我们又返回这个叉叉叉的对象。哎,工厂嘛,工厂的目的呢,不就是造你这个产品嘛,比如说携带工厂,那就是造鞋的,口罩的工厂就是造口罩的。啊,现在这个口罩的话呢,这个据说呢,在有的国家里边都已经可以拿这个货币,直接呢,就是相当于是货币了是吧,这个你去这个商场里边,你想买东西啊,给几个口罩啊,这个也可以给你这个产品啊,挺有意思是吧?好这个再拉回来啊,就是说我们变形二和变形三本质上来讲呢,使用的其实都是我们这个有关键字为代表的啊,调用构造器这样的一个操作,行,这呢是我们说最常见的一种方式,那么第二种方式和第三种方式呢,其实涉及到都是跟反射相关的那一种呢,就是我们通过这个大的class,它这个叫new instance啊,这个大家注意一下,这个new,咱们这个在JDK8当中还能用在九当中呢,我记得是已经就标成叫过时的了,就是不太建议去使用了啊呃,它呢,理解成咱们是反射的方式。
06:12
诶反射啊得这个方式,那么这个大的class这个new ince这个方法,为什么它会标识标识为这个叫过时呢?是因为它使用起来是不是非常的苛刻是吧?哎,它其实调用的是咱们这个对应的你这个运行室内的啊,咱们说只能哎是不是叫调用这个叫哎空餐的构造器。哎,空餐的这个,诶构造期啊,那同时的话呢,这个权限哎必须是是不是public的,所以它的要求呢,非常的苛刻,那咱们呢,后边呢,就会替换成用下边这个接口也是反射相关的叫constructor,是在我们那个浪包的那个reflect的那个子包下的啊,就是反射相关的这个包下的这个类叫构造器constructor,它呢有个叫newce啊,里边是可以放这个参数的啊,这呢也算是咱们叫做反射的方式,对吧?哎,它呢也算是反射的方式,那它呢,相较于我们上面这个方式的灵活点呢,就是可以调用。
07:14
诶可以,诶可以啊,诶可以呢,调用这个叫诶无餐的,或者我们说这个叫空餐的。啊,我这个因为电脑之前我重装系统啊,啊,所以这个呃,这个这个这个搜狗输入法,你看打这个词,打这个词的话呢,他都没有给我记录一下平时我常用的这些词是吧?诶可以调用这个空餐的,或者叫代餐的。啊,这个还真是很痛苦啊,哎,其实呢,大家经常用这个某一个输入法的时候呢,它会记录,我们常打这个词都做个记录,现在我重装以后呢,它这个就记录的就稍微差一些,可以调用空餐或代餐的这个构造器。然后呢,这个权限呢,没有要求,那这呢就非常灵活啊,所以呢,这个GD8以后的,呃,我们这个new呢,就被我们这个方式呢所替代了,总之呢,他们都算是反射的方式,OK,那么还有其他的什么方式,我们用于创建某一个类的对象啊,这里边又提到叫C。
08:10
啊,这个克隆它呢,是不调用任何的构导器,哎,不调用任何的构器,哎,当然呢,它要求咱们当前你这个类,它是不是需要去实现是吧,当前的这个。啊,这个类啊,需要实现啊,这个我们称为叫C。哎,克隆呢,就是我们说的这个叫克隆是吧,哎克隆,哎实现这个接口,那实现这个接口呢,那你自然而然就是需要呢,我们去实现,咱们叫充写其实呢是叫实现是吧?哎实现呢,它里边这个叫克隆方法。哎,这样子啊,哎,这样的话呢,我们也可以呢,实现一个对象的一个复制,诶实现一个对象的复制,我们呢,呃,实际上是已经有一个对象了啊,这个对象呢,我们再去调这个克隆的方法,然后他帮我们又克隆了一个对象。
09:02
啊这呢其实是一个叫潜复值啊行,这呢是这个克隆,然后呢,我们还可以呢使用叫反序列化,哎这个序列化其制呢,大家应该都清楚是吧?诶我们说呢,可以实现这个数据从一个进程到另外一个进程,它的一个传递啊这叫序列化啊基于呢本地程序呢,也可以基于网络的啊都没有问题,那通过反序列化呢,我们是不是可以从这个呃文件中啊或者呢,是从这个网络中,呃是不是获取一个呃对象的二进制流对吧。哎,然后呢,将这个二进制流呢,还原成我们内存当中的一个对象,这呢也是一种方式,OK,然后另外一个呢,就是咱们还可以使用这个第三方的一些库。啊,比如说我们这个叫啊of geneis啊,哎这样的一个库,那使用这些库的话呢,我们利用相关的一些资金码技术呢,可以动态的去生成我们这个constructor这个对象,哎这呢也是一种方式,行,那这呢就是我们提到了关于对象创建的这样的几种方式,大家呢需要清楚啊,有我们常用的,也有我们不太常用的,哎这个我们整体上呢有一个了解。
我来说两句