00:00
那下边的话,咱们就具体来看一下类的主动使用,看看都具备哪些场景,这呢一共是列出来了有八种情况,那我们这儿呢,把这八种情况呢,CTRLC粘到咱们这个代码层面呢,咱们一一呢给大家做一个验证啊,首先这块呢,我创建一个诶class啊叫active use1。好,这呢,我们主要来测试叫类的主动使用。来主动使用。好,那这个主动使用啊,咱们刚才也说到了,它主要影响的就是说我们是否会去调用是不是CL的这个方法呀,那主动使用呢,就意味着我们会去调用这个类呢,是帮我们生成的那个在编译器帮我们生成CL的这个方法了。好,那这里边儿呢,咱们一个一个来看,首先呢来看第一个说当创建一个类的实例的时候,那创建实例呢,我们可以通过new关键字创建,通过反射来创建,对吧?通过呢C那个方法来创建,可以通过反序列化的方式来创建,这呢对应的其实就是我们创建类实例的几种不同的场景,这呢我们就不一个一个的给大家介绍了,咱们挑着来说,比如说比较简单的这个叫你有关键字,好,我们来举例子。
01:10
比如说呢,我们在当前这个文件当中,我去创建一个类呢,叫做order类,这个order类里边呢,我现在呢,就写一个叫做静态代码块。那这里边我们写一个输出语句说呢,叫A的这个类的一个初始化过程对吧,那大家注意我们这呢,写了一个叫静态代码块,那如果我们当前这个类呢,在编译之后啊,我先做一个比如说re compel,对吧。好,左右编译了,编译之后的话呢,我们看一下它这个内部生成的这个,呃,CR Internet的这个类构造器,呃方法对吧,这个方法里边呢,就有咱们刚才说的这样一个输出语句,那我们说呢,类的一个主动使用,嗯,是不是就意味着是不是会调用类着叫C的这个方法了。啊,这个单麦第二呢,这块有点太智能了是吧,老师给我们当成一个自定义的标签了,我们生成这个结束标签了,行,我删掉啊,这个就意味着我们会去调用这个C的这个方法,那既然会调这个方法,我们在这个方法里边也看到了,相当于我们这个静态代码块呢,它的这个内部结构就作为咱们CR里边的一个具体执行过程了,那我们验证是否是调这个方法呢?就验证这个语句是否输出就可以了,对吧。
02:24
好,那上面的话呢,我们比如说整一个这个main方法,哎,我们通过呢,叫new的方式创建当前类的一个实例。嗯,创建好了,创建好的话呢,这块我们做一个。执行好,这时候大家会发现呢,我们这个语句呢,就输出了,那就意味着咱们当前new的方式会导致我们这个orderly呢,叫主动使用,那主动使用就是说我们这个掉了,这个方法意味着就执行了啊急是吧。即啊执行了叫类的初始化阶段。
03:03
OK啊,这就我们说的这个意思,行,那还有什么呢?反射呀,通过反射我们去new instance对吧,包括方法呀,反序列化呀,那这块我们比如说把这个反序列化给大家说一下吧。反序列化的话呢,那大家是不是还记得啊,就是如果我们是这是一个进程,这是一个进程,进程之间呢进行数据传输,我们要求呢,这个数据呢,得满足序列化机制,对吧?或者说我们这呢是一个本地客户端,这呢是这个服务器,那通过网络来进行数据传输,要求这个数据呢也得是可序列化的才行,这个呢,就我们提到叫序列化机制,那这个机制的话呢,我们比如说现在模拟一下,就是本地的一个。把数据呢,我们存储到本地,然后本地呢,再给它读进来,读到内存当中,就对应的一个反序列化的过程,那我们要得到这个文件呢,得先有一个是不是序列化的过程啊,那我这块呢,就先写个序列化,主要呢,咱们想看的是这个叫反序列化的这个过程,对吧,想通过这儿呢来进行一个验证。
04:03
那咱们得先有一个序列化过程得到的这个文件,那这块我就写一个代码。行,那这块呢,序列化,我们往本地呢,去存储到一个文件当中,咱们使用一个具体的输出流,对吧,Object输出去叫output stream。New,一个object。Output stream,然后这里边的话呢,需要我们再传入一个输出的一个流,对吧,那我们就用典型的new一个file output stream,这呢,我们就写具体的一个文件。比如呢,我们叫order.data文件,然后我就写入到这儿了,对吧,然后接下来的话呢,我们通过OS点,咱们真正去给它写出去一个对象,那这呢,我们去new一个order。写完以后呢,记得把我们这个资源呢做一个关闭,防止出现这个内存的泄漏,好那此时呢,我们再把这个异常呢处理一下,拆开是放那里对吧?把这个资源呢,咱们放到这个find里当中,确保呢它一定会被执行加个check catch前面的话呢,我们再加一个衣务判断,那保证呢,不会出现控制帧的这个问题,对吧?好那这时候呢,咱们就把这个程序呢,就写成这样了。
05:13
这就完成了,这呢实现的是一个序列化的过程。序列化过程,咱们先把这个反序列化呢,写完了,咱们一起来运行。反序列化过程呢,咱们用的是,哎,读进来嘛,Input stream input stream又一个file input stream这个文件呢,我们就从刚才写出到的这个文件呢,给它再读进来对吧,加上它,然后读的话呢,那我们就去read一个object。那咱们知道呢,往里边放的是一个order实例,那咱这块呢,就接收为一个order的实例,最后呢,你把这个资源呢,再进行一个close的关闭,哎,同样的道理,我们来处理这个异常。嗯,包住啊,选错了包住,然后拆开finally,把它呢,扔到咱们的finally当中。
06:07
诶本身呢,它还有异常,再做一个try catch,前面的话呢,我们为了保证它出现控制帧的时候呢,哎,别报这个控帧的这个异常,加一个不等于no对吧。好,然后这个位置的话呢,它还得有一个向下转型对吧,强转。OK,没问题了,行,这里边儿这个注释我就不多写了,这是咱们这个讲前面这个序列化的时候呢,大家应该都清楚的一个代码,好,那这个时候呢,我们首先呢,这个刷新一下咱们当前这个程序,在当前这个Mo下,你看没有我们这个具体的文件,对吧,那现在的话呢,我们做一个执行。诶执行这条执行大家发现呢,报了一个错误信息,就是默认情况下呢,我们这个自定义类呢,它是的对象是不可以序列化的,要想实现序列化,那你需要呢,去实现相应的这个接口叫sable对吧?这个接口呢,我们称为呢叫标识接口,它内部呢,就没有任何的这个具体的抽样方法,就是一个标识好此时的话呢,我们再去执行上面这个方法。
07:12
行,这时候呢,大家会发现呢,我们就给它序列化成功了,这个时候呢,就会生成对应的一个叫order.data这样一个文件,对吧?注意这里边呢,也涉及到我们这个orderder类的一个初始化过程,是主要是因为咱们这块new对象了,所以呢你会执行它,诶这呢不是咱们要关注的重点,主要呢,咱们想希望呢,就是我现在从这个文件中把这个数据呢,还原成内存中的一个对象,在这个场景下,我们这个奥类呢,也会进行一个输入法。好,我执行。好,大家看这时候呢,是不是确实执行我们这个初始化的这个语句了,对吧,那就意味着呢,在进行这个反序列化的时候呢,也会导致咱们对应的你这个类呢,进行一个初始化。啊,进行一个初始化,行,这呢是咱们说的这个第一个点。
我来说两句