00:00
好,那么讲完这个没方法之后呢,咱们接着来看一个新的内容,这个呢,我们称为呢,叫类的成员之四啊,叫代码块啊,这块我们再稍微的回忆一下我们讲的这三条主线哈,那第一条主线呢,叫类及类的内部成员,这块呢,关于属性方法构造器已经完事了。然后呢,我们现在要讲的是代码块。后续的话呢,还有一个叫内部类,哎,那么在前边三个完了以后呢,这块我加个分号。也就是说前边三个呢比较重要,后边这两个的话呢,从重要性上来讲,使用频率上来讲就比较低一些了,但我们下边要讲的其实就这个代码块了啊,第二条主线呢,我们已经讲完了啊,封装集成多态,第三条主线的话呢,关于关键字呢,诶,我们这块后续还有一些啊,像final abstract interface这个呢,都可以看作是这个关键字的使用,OK。好,那这块我们就来看看这个代码块的一个使用了啊。那么讲到代码块呢,我们稍微的回顾一下类中可以生命的结构啊,刚才也说了啊,属性方法。
01:00
构造器,这呢是第一个梯队的比较重要的,然后接下来第二梯队呢,叫做代码块,哎内部类。这个代码块的话呢,我们也可以呢,给它再换一个名字叫做初始化块。啊,这样的概念,这个叫代码块呢,是从它长的样子上来看的。就是封装的一段代码。从那个初始化块的角度来讲呢,就是说呢,它的作用是干什么的。啊,这个大家体会一下啊好,那既然呢提到这个事儿呢,我们就问一下我们在一个类当中啊,前面呢,我们也讲到了他们的一些作用啊呃,属性呢,就是你的一些基本的一些。呃,这个这个值是吧,呃,一些变量值,然后方法呢,就是关专门来体现这个类的这个功能的哈,扩大器呢,我们可以理解成呢,就是用来实例化创建对象的哈,那代码块来干什么的呢。诶,这块我们提到了它的主要作用啊,作用就是用来初始化我们这个类啊或对象的信息。啊,这个信息,那这个所谓的信息是什么呢?集啊,用来初始化啊,我们这个类。
02:04
啊,初始化这个类或者是对象的这个主要呢,就是这个成现变量了啊。哎,就是这样一个场景,OK啊,那具体怎么来用的话呢,那我们就得写这个具体的代码了。好,那比如说我们现在呢,去创建一个叫做blocked,哎,它的一个测试,哎这呢就写它了啊好,然后下边这块呢,不妨比如我这块呢,就声明一个class,诶真的咱们还用这个比较熟悉的person了啊。啊,在这里边我们去写啊,那以前呢,我们都讲过说这个属性,咱们那不妨呢,把这个属性呢给他。整两是吧,啊,这是两个属性了,好,那相应的这个方法的话呢,这个大家也都知道啊,诶public,比如word的一个it方法。人吃饭是吧?啊,然后构造器简单的也写一个啊。诶public,诶person类型的好,空参的构造器好整了一个啊好,那么接下来的话呢,我们说呢,可以写这个叫代码块了,这个代码块长什么样的呢?极其简单,就是一对大括号。
03:04
所以说呢,你看从这个型号来讲呢,这这就叫代码块啊,就是一个块啊好,那这个代码块的话呢,接下来呃,涉及到一个修饰的问题,像我们说到这个方法的话呢,那这个可以修饰的东西还挺多的啊呃,权限修饰符啊,你的反制类型啊啊等等这样一些东西去修饰。那我们代码块能不能有东西去修饰呢?哎,这块我们说了哈,呃,要有修饰的话呢,也只能有一个,那就是斯staic。啊,所以这块呢,我们就说一下,哎,它的修饰的话呢,说。这个只能使用。啊,只能使用啊这个死呆立克啊进行修饰。当然了,你也可以选择不用啊,所以这块呢,我们就把是否使用在这个修饰呢做了一个分类,那使用在这个修饰呢,我们就称为呢叫静态代码块。这个也很好理解啊。啊,静态大板块,那就是使用这个死在立刻修饰了。啊,那没有使用带修饰呢。
04:00
那就是非静态代码块。啊,很好理解。啊,没有。来使用。哎,死在立刻呢,进行一个修饰,好,那回过来那很自然而然的,这个呢,就属于叫非静态代码块了。诶,这是非静态蛋板块,那咱们再写一个叫静态蛋板块。啊,那这呢,你就加一个static诶这样就可以了,诶除此之外的话呢,没有任何其他的这种修饰,你说我这块我整个private啊,不好意思不可以啊,Public也不行啊这些呢都不能去使用。没有意义啊,为什么叫没有意义呢?其实这块就涉及到了它具体使用上的一个说明了,哎,我们讲这个说明呢,大家自然而然的其实就清楚了啊。好,那这块呢,为了演示它的一个执行呢,咱们里边呢去写些东西哈,哎,比如说这块呢,我们首先写上一句话吧,呃,这个叫非啊静态代码块一。啊,我写这样一句话啊,然后CTRLC一下,这个我们叫C啊,叫静态代码块一。
05:00
诶这样个场景啊,好,那么这个写完之后的话呢,诶我们就得考虑说,诶这个哥们儿他什么时候执行哈。首先呢,你注意它不像方法方法有名。诶方法什么时候执行呢。那就什么时候调什么时候执行。方法的话呢,我们又分为静态和非静态指数,像这个呢,属于非静态的,非静态的你要想调是不是得有对象。所以说呢,我们这个方法像E的方法啊,以前咱们都是诶这么着啊。哎,我呢首先造个对象,然后通过这个对象呢去调离的方法,哎,这个方法呢就执行了。来这块呢,你看我们做个执行,大家注意看啊走。诶,你会发现呢,我们除了呢,调用完这个抑制方法之外呢,他把这个代码块和啊,静态代码块和非静态代码块呢,看都执行了啊。这个就比较有意思了,以前我们是没有见过这样的结构的啊,哎,所以说呢,这个代码块呢,它既然都没有名了,它就不会说像方法一样呢,我们是调它的时候呢执行。
06:00
没有名,你说你要是主动去调吧,你都不知道该咋调。所以说呢,它这样的结构呢,不是我们主动调的。啊,那就是它直接在某一个场景下呢,就自动的执行了,那我们就要问诶,静态大码块和非静态大码块在什么样的场景下执行的。对吧,诶,这是我们关心的一个问题,好,那回过来我们就可以来写相应的这个注释的信息了啊好,那么首先呢,我们考虑这个静态代码块。静态静态,前面我们已经讲过静态属性,静态方法了,都提到过一点,叫随着类的加载而加载是吧。那这块大家你猜一下这个静态代码块它怎么着呀。随着类的加载而。诶这个咱们就不叫加载了,而执行或者叫而调用都可以。啊,因为呢,你看他没有名啊。它没有名就意味着你不可能显示的去掉它是吧,没有名嘛,那它就只能是会自动的执行,那自动执行加了static克了,那就跟类的生命周期是相关的了。
07:08
所以说我们就称为呢,叫随着类的加载注意而执行。但目前你看着好像也看不出来是吧,你这是造了个对象也执行了,非静态的也执行了,怎么证明你是随着类的加载执行呢?诶,那咱这块呢,可以去证明,比如说哎,比如说在这里边啊,我们写一个叫诶static的一个,诶string,我们加个叫infer吧,说我是一个人是吧。这呢是一个静态的属性。啊,这个属性注意看啊,我在创建对象之前啊,我把这个代码给注入掉了啊,哎,我直接呢,就在这个上面,比如写吧。我通过这个person呢,我去点一下这个infer,我把这个信息呢打印一下。好,你想啊,我们现在呢,是调这个属性,这个属性是静态的,我现在既然掉它了,那一定会加载这个类。诶这样的话呢,你这个属性也跟着加载了,所以我就主动的去调你了啊,那我们在加载类的时候啊,我说这个方法就会,呃,这个代码块呢,就会执行。
08:03
所以呢,我们去run一下。好,大家看啊,这时候呢,你看确实是不是执行了。哎,那说明呢,我们这个话呢,是没有问题的啊,要随着类的加载而执行,那大家接着想哈,我们这个类的加载是不是只会执行一次。所以进而呢,咱们这个静态代码块呢,是不是也只会调用磁啊。啊对的啊,所以这我们写一个第二个啊说呢,由于啊类的加载啊,只会。只会啊。来执行一次啊,进而这个静态代码块,它的一个执行。静态代码块,它的一个执行啊。也只会。啊,执行一次。好,那就意味的话呢,你看这块呢,我们去调了一下这个in核方法,你说我这块我我我再执行一次啊,这个肯定他不会再去执行。啊,因为这个类呢,还是用的你之前加载的那个类啊,所以说这块呢,类既然不加载了,它就不会再去执行啊。
09:07
好,这是我们说的这个场景,然后接着大家看。在我们刚才这个执行的过程当中啊,你会发现的这个非静态代码块是没有执行的啊。啊,因为呢,它是非静态的,跟这个呃类的加载没啥关系,只会跟。对象的这个加载有关系是吧,或者叫对象的创建有关系了,所以呢,你看下边这块,哎,我呢创建一个。哎,当前类的对象了。啊,那么这时候呢,我们就要想一下对象创建了,那像我们原来说的这种非静态的这种,呃。变量啊,它就会在对空间中去分配了啊,这种非静态的方法的话呢,我们也可以直接通过对象来调了,那么非静态代码块呢。是不是也应该执行啊,哎,对好,所以这块呢,我们再去做一个run。OK,此时的话呢,你会发现啊,上面这两个是我们调的这个事儿。然后下边这个我们用了一个对象,诶,你发现了他执行了。
10:02
哎,那么这块呢,我们如果去解释呢,它就应该叫做。诶随着对象的创建而执行是吧。哎,随着啊对象的创,呃,创建啊。诶而执行好,那么我要是创建这个类的多个对象呢。我又创建了一个是吧,那你说这块他还会再执行一次吗。会的。你看是不是又执行了一次。诶,所以这块呢,我们,哎相较于上面这块呢,它也有个特点啊说呢诶而且呢,就是每创建。啊,没。创建。这个当前类的啊,一个实例。哎,这个就会执行一次非啊静态代码块。啊,没问题啊好,那么接着的话,我们从这个宏观上来去看哈,所以呢,我们去加载力的时候呢,这个静态代码块就执行了。
11:05
我们每创建一个对象的时候呢,这个非静态代码块就执行了,那么这块就涉及到他哥俩到底是干什么用的。哎,其实上面我们也泛泛的这样提了一下他们的作用,诶提了一下他们的作用了哈,那具体来讲呢,对于静态代码块它的作用呢。哎,就是用来初始化这个类的这个信息。啊,那么你相应的这个非静态代板块呢,是跟你对象相关的哈,所以呢,你的作用呢,就是用来初始化咱们这个对象的这个信息的。那这个信息呢,都可以有什么呀,或者你这个代码块里边都能写什么呀?诶那其实我们刚才呢,这块看到了这个代码块呢,它其实就类似于像我们方法的这一个大括号一样。方法里边呢,我们可以呢,调用当前类中的产业变量啊,叫方法啊,或者你自己写一些输出语句啊,这样的一些执行语句都可以,在这个代码块里边呢,也同样的道理。哎,它里边呢,也可以做这样的一些事儿啊,你比如说我们上面这块呢,叫infer,这是一个静态的,那静态这里呢,我们考虑说,诶是不是在这里边也可以调一下是吧。
12:09
诶,所以比如说一方面啊,我们打印一下啊,说这个infer。哎,这个值呢,看是多少。哎,这呢,我就打印了,当然了,你也可以把这个值,你说我想修改修改也行。啊,你要修改的话呢,就体现为对它这个值呢,做了一个初始化了。啊,那么对应这个非静态代码块呢,一样的道理啊,因为呢,我们造对象的时候,每造个对象它就会执行一次,那里边儿呢,比如我们就把这个age呢,比如我就附个值是一了。哎,这不我就把这个A值的值给改了吗。啊,那要改了以后呢,哎,你说我们这块造完这个对象了,接下来啊,我呢就通过这个,呃,P1呢,咱去调一下这个A值,你说这个值它会是多少呢。红单构造器这块是吧,没有赋值,这呢,也没有显示赋值,在这里边附了个值是一了,这个是一不。诶事宜啊,因为呢,你在诶这个创建对象的时候呢,这个非静态板块执行了,执行的时候呢,就把你当前正在创建的这个对象的属性呢,就复制为一了。
13:10
哎,这呢就体现为这不是用来这个输入化这个信息的吗。OK啊好,那通过这个说明呢,咱们也强调一下啊,这个静态代码块也好,非静态代码块也好啊,都一样的啊,这个相同点呢,就是内部可以呢,去呃声明变量啊这个调用。呃,调用这种呃类的这种,哎,或者直接我就泛泛的说啊,调用属性或方法呀,或者呢,这个去呃这个编写这个输出语句啊。哎,等操作啊,这呢是都可以来写的啊,下边这个呢,也是一样的道理。啊,也是一样的道理啊,好,没问题了。这个呢,我们就说到这儿了,然后接下来诶,我们把这个静态代码块和非静态代码块呢,比如放到一起来看,哎,大家呢,你考虑一下他们执行的先后顺序。
14:02
啊。对,毫无疑问,从理论上我们都能分析出来,一定是先执行静态的,后执行非静态了。因为呢,我们得类线加载,类加载了,然后你这个构造器就加载了,然后你通过构造器才能造对象。哎,那么在你类加载的时候呢,它不就执行了吗。哎,所以说呢,这个理论上我们都可以去推出来啊,那就是静态代码化的执行。嗯,代码块的这个执行啊,要先于。哎,非啊,静态代码块的执行。这个都都不用多说,包括从我们刚才这个,呃,运行的这个效果上来看啊,虽然说我把这个非静态的,你看放到上面了,静态放下边没关系啊。那我们执行的时候呢,一定是先有静态的执行,而且就执行这一次,非静态呢,你造个对象就执行一次。啊,就他。好,那么下一个问题哈,我们在一个类当中,诶,我能写多个静态代码块,或者是多个非静态代码块吗?
15:00
可以是吧,可以的啊,比如说在这块呢,我们整个大括号,哎,我们就写一句话啊,我叫非静态代码括二。啊,他了,那这个呢,也一样道理啊,我们再写一个啊,斯代蒂克。啊,一个大括号,哎,我那叫静态代码括号。好,这个写完之后的话呢,我们下边再去执行,大家看一看这个效果啊。好出来了啊,哎,然后呢,你先看这个。哎,咱们说这个这个事儿啊。看这个啊说呢,静态代码块一有个音符,这个呢,是因为我们在这里边呢,这不有个输出吗。然后接着呢,静态代码块二啊,就它所以呢,静态呢就先执行了,后续的话呢,我们造对象,每造一个对象。那这块我们这个非静态呢,这不就执行一份,又造个对象啊,又执行了一份。所以呢这块呢,就先后执行了。啊,那么现在的问题就是说我们这块发现的是先执行的这个,后执行的这个哈,你说他俩呢,先后顺序是怎么定的呢。
16:00
哎,对,这块呢,就完全取决于他们俩的这个顺序了。你比如说我把这个呢,放在了上边了啊,然后下边这个呢,你也可以呢,同样的啊。诶,我们去交换一下,交换完以后我们再去run。哎,这时候你发现你看他就先执行二了,这个也是先执行二。诶,所以说呢,诶回过来啊,我们在一个类当中,呃,如果呢,你要编写了多个静态代码块,那么他们的执行顺序呢,就是按照你声明的顺序来的啊。呃,如果声明有多个啊,静态代码块。啊则按照声明的先后顺序执行。哎,这呢就它,然后下边这个呢,也同样的道理啊,如果呢,你要内部呢,声明了多个的哎非哎静态代码块也是按照你声明的先后顺序去执行的。啊,这个说完之后呢,我们再提一下啊,在实际开发当中啊,咱们一般不会去声明多个的啊。因为你想他就按先后顺序执行,那不跟写到一个里边没啥区别吗。
17:01
所以其实我们开发中,如果你要需要的话呢,就写一个就行。这个也是一样啊,你把这几个呢,合并成一个就可以。你说我就不想合并,我就想这样写,你这样写了,编译完以后生成的C码文件呢,也帮你合并了。啊,所以说呢,你这块呢,就合成一个就可以了,没必要呢去写多个。OK啊好,这个问题呢,我们就说清楚了。这个说完以后呢,我们接着来看哈,这个静态代码块呢,说主要用来初始化你当前这个类的一些信息了啊,你像这里边我们对这个iner呢,做了一个调用啊,我没复制啊呃,然后呢,非静态这里边呢,我们初始化对象的信息了,这呢我把A值呢改了一下值。呃,具体来看的话,呃,又涉及到我们像前面讲静态方法一样哈,说呢,静态代码块里边,哎说能够,呃初始化你当前类的信息,那这块呢,其实就暗含着应该是一些静态的信息了。那么就涉及到我在静态代码块里边能不能调非静态的。啊,那反过来非静态代码块里边能不能叫静态的。
18:01
可以,诶对,其实这块呢,跟咱们说那个方法就一样是吧。诶这块呢,其实理论上呢,也能够推出来啊,由于呢,你是随着类的加载而执行的,所以说这时候我们非静态的这些结构啊都没有。哎,那就意味着咱们这个静态代码块内幕。啊,内部呢,只能调用静态的结构。呃,静态的这个,呃结构啊,那这个结构呢,主要指的就是极。诶这个诶及啊静态的这种属性或者是方法,诶明确一下啊,是不能够调用非静态的结构的。啊,那就是急。呃,非静态的这个属性或者是方法。啊,这是很明确的,好,那么反过来啊,这块提到说这个,哎,我们把它呢,再粘过来啊,非静态代码块中。啊,我们说呢,是可以是吧。
19:00
诶,可以呢,调用静态的结构,也可以调用非静态的结构。诶调用风险研究啊,那这块呢,我们其实就从这个生命周期的角度去解释呢就可以了啊,那简单的来看一下,那像我们这个在这个里边呢,我们调in这没问题,你说我调一下这个H啊,不好意思不行啊,打印一下说age等于啊,加上一个age啊这的就错了。哎,你也可以理解成这个A前面有个C嘛,哎,这是我们类的加载哪有对象呀,哎,所以就不可以啊好,那以及的话呢,我们在这里边去调这个一的方法。哎,显然呢,也是不靠谱的啊,他那是非静态的啊,这也掉不了啊。好,这块我就没有刻意的去写这个静态方法了,呃,其实大家呢,也能够理解啊,以这个属性为例啊,真能调这个静态的啊,好,然后呢,在这个非静态代码块里边啊,比如我们这块呢,去打印一下咱们这个in份。CTRLC一下。哎,这能看显然是没问题的啊,非静态里边叫静态啊。因为提前已经加载过了,所以能够调啊,没啥问题。
20:02
好,那么这块的话呢,咱们其实把这个代码块这个事儿呢,也就说清楚了。是吧,哎,就这样。诶,那么主要呢,大家核心的需要这个记住的点是什么呢?我们一般在开发中要用的话啊,静态代码块里边初始化的时候呢,就是把你这些静态的属性做一些赋值。哎,非静态代码块呢,我们就可以对这个,哎,这叫什么非静态的这种属性呢,做一些复制。哎,这就是它的一个主要作用啊,主要作用啊行这块呢,我们就能够清楚了,那关于这个主要的一个知识点呢,其实我们也就解释的就差不多了。好,那么这个内容呢,说完之后呢,我们接着来看一下这个练习,来看下这样一个需求。OK啊,这个需求呢是这样的,首先呢,声明一个类,这个类呢叫做user类,包含的属性啊,在这儿呢,然后盖塞方法都有,呃,下块呢提到了一些构造器的问题,那我们就一边写呢,一边看一边写啊首先的话呢,我们看到这块提到这个事儿。呃,先把这个呢,我们给它创建一下啊,新建一个类,这个我们叫做user啊。
21:04
把这个声明呢,我们就放到这儿了。哎,这样啊。好说呢,包含有属性啊,Private string类型的叫username。哎,Private,诶死类型的叫啊。Password。诶这样啊,好,再有一个叫private long类型的啊,这个呢叫registration。就注册的一个时间。哎,这个我们特意的给大家标识一下啊,说的时间这块呢,我们用的是一个浪类型,就是记录的是毫秒数。对,以前我们讲那个计算一个代码执行时间的时候呢,我们有system.current time minutes是获取那个毫秒数啊,跟这个是一个意思了啊,Long类型。好,那么对应的这个属性的盖赛方法啊,说这个注册时间呢,没有赛的方法了啊,一旦呢,你复制以后呢,就确定下来了,好这我们去alt加insert啊。
22:00
嗯,咱们先点一下这个,把它俩呢选中。呃,然后呢,我们再。哎,操作这个叫。Registration啊,它的一个get方法,针对于它的。啊,这就没有set了啊,或者你把他们一开始的六个都生成,你再把那个set给删了也一样啊。好,这块呢,是我们提到的这个关于这个属性和概率方法这块,接着构造器的问题。啊,还有这个概方法的问题,好CTRLC。啊,接着啊。嗯,看这个事儿。嗯。好,这块呢,提到说包含一个无参的构造器,呃,要求呢,我们有这样的信息的一个啊,这个这个赋值啊,好,下面我们来做这个事儿。Public the user。对这么着啊,那么呢,在这里边儿呢,首先我们输出个信息啊,叫新用户注册。好,没问题,接下来说这个registration time,它呢复制为当前系统时间,把这个属性。
23:05
哎,我们就复制为当前系统时间,咱们前面讲的啊,叫system点啊current minutes,这个叫获取系统当前的这个事件。啊,这个大家还有印象吗?它得到是个浪形的啊是哎距离。对,距离1970年啊,1月1号是吧。啊,1月1号。啊,然后呢,这个叫诶00:00:00是吧。00:00。呃,零秒呃,然后呢,到现在的这个黄秒数啊。哎,换秒数好,那它得到的是一个long型的这个值啊,这个值呢,我们就直接付给咱们这样的一个属性了,OK,接下来这个username呢,这个默认的就是当前系统时间啊,它就相当于跟上面这个值呢是一样的啊。Use a name。
24:01
呃,系统当前时间,其实这块。嗯,行,我就直接这样这样写吧,是吧。呃,默认的是系统当前时间,但是这时候呢,它是一个string类型的是吧。怎么办呢?简单的话呢,你就直接这么着一下就行是吧。啊,这是一个它,然后接下来呢,这个password呢,是123456啊。哎,这个也是一个字符串吧。哎,这就写完了啊好,这是其中的一个构造器,接下来。这呢,是一个代餐的构造器。类型的啊。类型的password。那这里边儿啊,首先也是输出叫新用户注册。诶,这没问题,好接下来呃,这呢,仍然是把我们这个registration呢,复制为当前系统时间啊这个一样。还这样写,然后下边这块呢,这两个属性就按照我们附的这个值来了,哎,那就this点啊,Username username。
25:03
哎,C password啊跟行参的这个password,哎,进行复制好写完了啊。写完以后呢,接下来他又提到了这个包含一个get infer的方法,返回用户名、密码、注册时间。啊,这个比较简单啊。这个其实就类似于我们那个叫tona啊。对啊。哎,用户名。呃,加上我们这个叫username啊。密码。Password。注册时间。哎,加上这个。Registration是吧,这样一个time。好,这样的话呢,我们就写完了这类呢,就这样呢,去做这个设计就OK了啊。啊,那你也可以简单的去做一个测试。哎,我们这个呢,叫user的一个测试啊。啊,过来这块的话呢,呃,你用哪个构造器呢,都可以啊,比如说你用一个U,哎,我们使用这个空三的构造器了,这个呢,你U一点get一个iner。
26:05
哎,这个我们再去out一下,这样来我们先去run一下啊。好,这块呢,这个用户名就是系统当年这个时间毫秒数,密码注册时间啊,是这样的啊好接着你可以呢,再去创建一个新的啊U2。啊,这个呢,我们就指定一个啊,比如用户那叫Tom密码。啊,这个呃,654321啊,比如说他是吧。啊,这个呢,我们再打印一下U2点get一个in信息。诶,Run一下啊。好可以了,诶这就是这个用户名,密码是我自己指定的,这个呢,就是这个毫秒数。没问题啊,行,那这个题目呢,你发现诶这也没有代码块啊。哎,那么接下来呢,我们可以呢,去做一个调整啊,比如说这块呢,我就叫做USER1了啊。哎,这个优色一呢,咱们可以先原封不动的把这个优色的这个里边的逻辑呢,我先都拿过来。
27:01
诶粘过来啊,把这个构造器这块我们微调一下。啊,这这没问题了啊好,那么这个关于我们代码块的使用啊,我们可以这样啊。这个时候呢,没有涉及到一些所谓的静态的信息了。所以说呢,我们就用不着这个静态代码块了。说这个类呢,在加载的时候呢,需要干点什么吗?说啊也没啥可干的,行,那非静态代码块呢,我们可以稍微的体会一下啊。非静态代码块呢,我们说呢,可以对当前类中的这个属性呢,做一些赋值操作了。啊,就是你每创建一个对象,它就会执行一遍。跟我用哪个构造器有关系吗?5万。啊,一会儿呢,咱们讲完这个练习呢,咱们就看一看啊,这个属性呢,在哪些位置能赋值,以及先后顺序了。呃,咱们现在先泛泛来说,刚才呢,我们演示这个block使用的时候呢,说我们在new对象的时候,我们这个代码块就执行了,其实呢,跟你用哪个构造器啊没没关系,你用哪个构造器呢,它都会执行啊。
28:01
那么这里边儿呢,我们会发现呢,不同的构造器呢,它都会有相同的这个代码。比如说这里边儿这个前两行。哎,那么既然有相同的一个代码,那就都意味着都得执行,既然都得执行,我们说呢,在你调用构造器的时候呢,代码块也会执行,不妨我就把这样的逻辑呢,我就写到代码块里了。哎,也就是这样的两行代码粘出来,我就放到这儿了。啊,那么在你通过这个构造器去造对象的时候呢,我说他也一定会执行。所以说呢,谁先谁后,咱们一会儿说反正是会执行是吧,好,然后你下边这块呢,是不是就不用写了。哎,我就注释掉就可以了。这儿呢,可以看到是我们这个代码块的一个使用场景。好,那么我们再拉回来啊,在这个测试这个位置,呃,这块我们得有必要呢,创建一个新的了是吧。哎,这呢,咱们是对应的这个叫USER1的这样的一个类了啊。哎,比如我们这个叫三是吧。UC这个类好这样啊,这三。
29:02
好,这时候呢,你看我们去调这个get info的时候啊执行。啊,就在下边这块了啊,你看正常这个新用户注册这个信息呢,仍然打印了,而且呢,这个注册时间你看照样的也有值。哎,那我们刚才的这一句话的输出和这个值的一个赋值操作,咱们不就是放到了这个代码块里边了吗。哎,所以呢,就诶正常也能执行。啊,这就是他的一个使用场景啊。它的一个使用。OK啊,这块呢,我们把这个呢就说清楚了啊呃,这呢是代码块的这样一个使用场景,所以大家你也能看到啊,原来呢,我们在构造器里边写的一些啊相同的一些代码了,你就可以呢,之后就放到这个代码块里了。当然了,对,有同学也会说说我原来我写到这儿写了一份,在这个构造系里也写了一份,说我们也可以通过这次的方式,不是也能省吗?是吧?就是你要把这两行代码假设啊,这两行代码你写到这儿了,那你大不了就在这块呢,是不是掉下边这个过道器就行了。
30:03
或者你把这个这两个代码写在这儿了,然后你下边这个调上面这辅导器也可以哈,对,这就是我们以前的处理方案,说现在的话呢,你可以不用了,你单独的把它放到代码块里就可以。但是以前的方式呢,也可以用。所以说这个代码块呢,从现在来看呢,似乎不是必须的哈。可用可不用是吧,所以从那个角度来讲呢,咱们这个代码块呢,确实哈。他呢,没说一定要用。啊,前面这三个结构呢,肯定是少不了的,这个的话呢,根据你实际情况啊,你想用呢,你就可以去用。啊,是这样个情况啊。呃,但是有一个场景呢,我们说这个代码块呢,还是有必要啊要用的啊,我可以呢,举一个例子。啊,举个什么例子呢。啊,我先简单说一下这两句话啊,这个静态战马块呢,咱们说了啊,它呢是用来初始化这个类的信息的哈。首先呢,我们现在假设这个类里边有一个静态的属性。这个属性呢,现在需要赋值了。
31:01
这个赋值的话呢,是不是要么显示负值。那要么呢,哎,不代码块里边可以复制是吧,现代代码块能复,那除了这个之外呢。呃,构造器就不要想了。因为构造器呢,主要是用来初始化你这个对象的信息的是吧。诶,所以呢,在构造器里边去给这个静态的属性赋值呢,能赋,但是呢就别付了。那成啥了,你想想啊,我们静态呢,咱们昨天讲过啊,他就只有一份儿啊。你要是每造个对象在构造器里边就给它赋个值,那是不是把已有的对象的这个值也给影响了?所以在构造器里边不要去操作静态的。那现在关于静态的这个复制呢,要么显示的,要么是不是就代码块了。啊,那么在有一些时候啊,你用这个显示赋值呢,不是特别靠谱。这个时候呢,你就得用静态代码块。那能不能给举个例子呀,哎可以,哎这块我们在课件里边啊,我这块呢,放了一个具体的一个例子。哎,我写到这儿了啊,这个代码的话呢,会用到我们以后要讲的这种异常了,所以大家看起来可能会有点儿吃力哈,那大不了你就先,呃,先别太研究这个事儿了。
32:10
啊,我就先这样去了一下啊,好大家你看啊,我有这样一个场景。说呢,我现在声明一个这样类型的一个变量,这个变量要负个值。啊,你也别研究这是干啥的啊,这以后我们讲的这个连接池啊,好,我现在呢数据连接池啊,现在呢,我要给这个变量赋个值,这呢是个静态的。一方面直接在这儿附一个。呃,另外一方面的话呢,你可以通过这个静态代码块去付。那我说呀,这时候呢,在这付不靠谱,为啥呢啊,你看这个值赋的呢,是怎么着呢,是拿这个东西赋的值哈。啊,那你说把这个这不就完了吗?诶这个我在写这的时候,你发现我这块还得需要一个参数是吧。这个参数的话呢,你得提前造好呀。说你这造号也行啊,我把这个new直接放这不就行了吗?还是写成一行,但是你注意我呢,还得需要拿着这个对象呢,去调用一个方法。
33:02
说白了啊,就是这个位置在赋值的时候呢,一行代码搞不定啊。那我呢,需要呢,提前准备好多东西。啊,都准备好以后,我们才能够去执行它。那你要是放在这不靠谱,放在构造器呢,咱们说也不合适。那就只能是放在这个静态代码块里了。啊,那就放到静态代表块里。啊,体会一下。这个有点感觉不。有点有点懵是吧,就是你别看进去了啊,这个细节你不用看,我再说一遍啊,你要这块呢,假设我们就一下。那你就直接写显示赋值不就完了吗?但问题现在呢,你看它不是new的啊,它是通过一个方法调用的,返回的这个值是这个类型的,这也没啥问题啊,问题就是你现在返回的这一行代码也搞不定,因为这里边儿你看这个东西,我们前面是不是写了好几行代码才把这个事儿给。整好了是吧,前面这不都是执行语句吗?
34:00
你这个执行语句你能在这写啊。不能啊。你不能在这写,那你写哪儿呢?写到构造器,构造器内就意味着每造个对象我都得执行一遍,那现在说呢,我们这个类呢,这个代码所在的这类,我就不打算造对象了。假如不到对象,那你这块要扩大器可能也没用是吧。况且的话呢,你每调一次构造器,我这块呢都执行一遍,也没有必要,因为静态的执行一次就够了。所以呢,不能放在构造器,那我放在这个静态方法,比如我给这个设置一个赛的方法。嗯,也行,但是那时候就晚了。我现在希望呢,类加载完这个呢,就执行好。那你想这时候呢,显示不能付扩到期不让用,下的方法也不让用。是不是就得是代码块了?哎,我就放在代码块里了。诶,所以这儿呢,我举了一个场景啊,就是说对于这个静态的话呢,我们放在代码块呢,比较适合的一个情况。OK啊,那么在实际开发当中啊,咱们自己用的时候呢,一个是我刚才举的这种场景啊,其他这种场景下呢,像这种非静态的这种属性啊,呃,一般呢,大家可能呃可以选择它,你也可以呢,就选这个构造器是吧,或者显示赋值一般场景都行。
35:12
啊,在刚才举的那个例子呢,属于一个极端的场景,是必须要用了。啊,体会一下就行啊。好,那这样的话呢,咱们关于这个block呢就结束了。
我来说两句