00:00
接着呢,咱们讲下一个结构,这个结构呢叫做代码块,这个代码块呢,属于我们面向对象三条主线的第一条,又回到第一条主线了,第一条主线类和类的成员讲过了,属性、方法、构造器,这三个结构呢,就是已经讲过的这三个呢,是我们说在创建一个类的时候呢,非常重要的三个结构,基本上我们在创建一个类的时候呢,都通常需要考虑这三部分结构的,而且我们还提过像这个构造器了,每个类都有,你不写它有,所以这你肯定逃不掉的,那方法的话呢,那通常也会有那一个类呢,你们我们说它这个功能强大与否,其实主体上还是通过方法来体现的,那同时的话呢,一个类当中如果你需要的话呢,也可以定义一些变量,这个都是一个很正常的情况,那除了这三个常用的结构之外呢,我们还可以定义另外两个结构,一个呢叫做代码块,一个呢叫做内部类,那我们内部类呢,放到这一章的最后去讲,先来谈一谈代码块的使用。先来谈谈代码块来使用,那这呢,咱们就直接呢上代码来写,新建一个工程啊,新建一个包,这个呢,还拿咱们最熟悉的person来说是吧,诶我这个名呢,我叫了一个block吧,它的一个测试,Block呢就是代码块的意思,叫类的成员之四,代码块。
01:25
代码块叫代码块也行,或者呢,我们也叫做初始化块,叫代码块是从它这个长的样子上来看的,就是一对大括号叫代码块的,从这个功能上来讲呢,它叫做初始化,叫初始化块,就是用来做初始化的,所以呢,叫哪个名呢都可以,首先呢,我们先去声明一个class,这呢我是一个person类了,那先把咱们比较熟悉的这样一些结构呢,给大家补充一下,String类型的name int类型的age,我们我们在那给大家去提供一个string类型的,比如叫一个描述吧,D,呃,D describe或者description,就是关于一个人的描述,这样的三个信息构造器的话呢,也可以去提供一下,这呢是一个显示的空参构造器,然后呢,我们可以再提供一个public,嗯,来一个person,这个呢,我们写一个死针形的name,写一个in。
02:26
形的A,关于这两个属性呢,做一个初始化行,然后这个死锥形的一个描述的话呢,我就不往这放了,或者说呢,我们把这个呢,属性就生明成个静态的,咱们也已经讲过了,这呢我就加了一个static关于这个人的一个描述,这个描述呢是个静态的,那不妨呢,我这呢也可以考虑直接给他赋一个值,说我是一个人,这给他赋的一个值行,那接下来的话呢,我们还可以去定义这个类中的一些方法,简单的定义两个word的一个it方法。
03:03
这呢,我们这个叫吃饭行,这个呢就搞定了,然后接着呢,我们再写一个叫to string的方法,我们昨天也讲过了,Out shift s点一个to string,默认情况下呢,我们这个to string方法当中,只会把你当前类中的非静态的属性给输出出来,就是相当于归你具体这个对象所有的这个结构,我们给输出了一下,所以这个D的话呢,这个没显示,没显示上就没显示了,诶我们也就只显示这两个属性。好,这呢,我们基本上就把这个类呢先搭建出来了,这呢,我们看到的这个叫属性,这个叫构造器,两个,然后下边呢定义了两个方法,那接着呢,我们来谈一谈构造器的问题,嗯嗯,一谈这个代码块的问题,代码块呢,我们可以给他写到这个位置上,或者你写到这个位上,写到哪其实都可以,那不妨呢,我就写到这了。
04:02
代码块,代码块它的结构呢,最简单就是一对大括号啊,这就叫做代码块极简,极度的简单,极度的简洁,应该是这个方法也好,构造器也好,我们当时讲它的时候呢,还提的挺细致,说有权限、修饰符、法位、类型、方法名、形态列表,方法体等,那对于这个代码块来讲,似乎呢,你要对接方法的话呢,前面这些呢,都不用考虑,只需考虑这个体就可以了,也就是我们这个大框号里边这个内容,那么这时候就涉及到这个代码块连个名也没有,那到底干什么用,以及呢怎么用,就是这个问题。好,我们下边呢,来写一写代码块,首先第一个问题,代码块的作用,刚才呢,其实也提了一下,代码块呢,从从这个格式上来讲呢,它叫一个代码块,因为就是一个大括号,就像你封装起来几行。
05:02
代码一样,这是一个块叫做代码块了,那么从它的功能上来讲呢,它通常都是用来初始化我们当前的类,或者是当前的对象的当前类的对象的,所以说呢,它的这个作用就是用来初始化类或者是对象。从这个角度来看呢,我们把它叫做初始化块,那就这个意思,行先有个大概的一个印象了,然后接下来呢,关于类中的代码块,这个结构,我们呢,说它能不能用一些东西来修饰啊,说这么简单是吧,结构这么简洁,说呀可以修饰,如果要是拿这个东西去修饰的话呢,它只能够使用static来修饰,只能用static来修饰,也就是说我们前面呢,可以加上一个static。那这个呢是一种,然后呢,你不加的是一种,除此之外呢,不可以使用,像private呀,像像我们后边还没有讲到的什么abstract呀,Final啊等等都不能修饰,那不妨呢,我们就拿它是否用带这个修饰呢进行一个区分,相当于我们把这个代码块呢分成了两类,这呢我们说一下,说代码块如果有修饰的话,只能使用static,那么自然而然的我们就提供了一个叫分类。
06:29
这个分类呢,我们就称作叫做静态代码块,以及叫非静态代码块,行静态代码块和非静态代码块,那么静态跟非静态的一个主要区别呢,就跟咱们前面讲的这个静态是一样子的,那具体都有哪些区别呢?下边咱们就得分别展开去说一下静态代码块和非静态代码块了,那么我们关于这个代码块的一个使用呢,大家其实主要关注的就是它俩有什么区别,我们开发中呢,大概怎么去用就OK了,那我们先把这两个的区别说一下,静态代码块,非静态代码块分别呢,咱们展开进行一个说明,好正好呢,我这块呢,写了一个静态的,写了一个非静态的,嗯,这我就给大家再详细点说啊,这个叫static的代码块,或者呢,你叫静态的代码块也可以。
07:24
这呢叫非带这个代码块,这是代码块了,我们在他的这一对大括号之内呢,就可以来写代码了,能能写代码呢,最起码呢,我们说先整一个输出语句吧,来一个hello static block,你好,先来代码块,然后下边呢,我们也可以写一个,最起码呢,我们看到说,哦,代码块里边呢,它是可以写输出语句的,就有点像我们在方法里边写一下。哎,实际上这个代码块里边呢,你就可以想象成它就像这个方法的一个结构一样,方法体一样的,直接写输出语句是没有问题的,所以这块呢,我们写一下说静态代码块我们说呢,说可以内部可以有输出语句,那下边呢也是一样子的。
08:19
诶,CTRLV一下,CTRLS一下,内部可以有输出语句行了,那么这是我们写了一个输出语句,下边呢,我们想说这个输出语句怎么执行呀,我们想让这个代码块里边的这个输出语句执行一下,执行一下的话呢,你要说考虑像以前用构造器或者用方法的话呢,方法你得通过对象或者通过类呢去点的方式来调,那构造器呢,你是new的方式呢,后边加个构造器都有特别明确的调用的一种方式,那你说这个代码块就跟我们前面讲这个匿名对象一样,你是不是都没有个名,不知道该怎么去调。那就咱们来体现一下,体会一下,看看能不能让他呢去执行。
09:01
能不能让他去执行,在这呢,我们先写一个没方法,没方法干个什么事呢?嗯,我就先不造对象了,我先怎么着呢,我拿我这个person呢,我去调一下这个属性。此时呢,我就直接,嗯,直接这样吧,Person点二来一个de,把它呢赋给一个string形的变量。我就叫一个DEC,那这个时候呢,其实相当于我们能调这个这个属性,或者叫静态变量了,附一个心态变量,相当于我们这个类呢,是不是此时呢,就会加载到内存当中了,那它就能加载到内存中了,加载到内存中咱们上午呢讲过说呢,当你去使用一个类的时候呢,类就会加载,类要加载的话呢,像咱们所说的这种静态的结构,通常是不是都会加载啊,那就意味着这个静态的属性,这个下边咱们没有特意的写一个静态的方法,如果要有静态方法的话,给我下边写一个static,写一个word叫infer。
10:02
我是一个。啊,这个快乐的人,诶这样我就写了一句话,静态的属性,静态的方法说会随着咱们这个类的加载而加载,那这呢,你会看到一个叫静态代码块,我们看看它呢,会不会加载来,我们这个时候呢,执行一下。诶,你看看是不是就调用了呀,就调用了这个时候呢,跟咱们说的静态方法其实还有点儿区别,静态方法或者说静态的属性咱们是掉了啊,属性我这块掉了,你就看这个方法,这个方法呢,其实我们是随着类的加载而加载了,但是我没有执行。怎么叫执行呢?谁也没出来是吧,怎么叫执行呢?是不是我们通过类去点你这个音符才可以被调用啊,但是你会发现我们这个结构它不光是叫随着类的加载而加载了,它还执行了是吧?所以这块呢,我们就得这样写了,对于我们这个叫静态代码块,我们发现它呢是随着类的类的加载而。
11:14
不是,而加载了,它比加载还过分,而执行随着类的加载而执行,诶你想想这个静态代码块,如果仅仅是随着类的加载而加载的话呢,那加载完以后,你像人家那个方法,你可以点去调你这个代码块是不是连个名也没有啊,那就意味着呢,我们是不能够主动的去调这个代码块的,所以说呢,这个代码块呢,它通常都是自动执行的。那关键就看你到底什么时候执行,那我这时候说呢,像这个静态的代码块呢,它就相当于是随着我们这个类的加载呢,它就执行了,就是这样个情况,那它是随着类的加点执行了,那这个没有执行。因为它是非静态的,它是非静态的没有执行,那你敢你猜一下他这时候应该什么时候执行啊。
12:06
对,像我们这些非静态结构,通常都说是不是随着这个对象的创建而加载啊,那这时候呢,我们就去创建一个对象,我new一个person。在这CTRL1我们给它声明为一个变量,比如叫P1了,那这个时候呢,咱们相当于就是造了一个对象,我用这个point里边也没写代码,我们执行一下看看OK,好,看到它执行了,刚才呢,我们只有上一行代码,然后呢,第一个输出了,然后下一行的时候才输入它了,所以说它呢是随着我们new对象才加呃,才执行的,所以说呢,我们这里边关于非静态代码块呢,提一下它呢是随着对象的创建而调用。或者叫R执行,他们就是代码块是静态的还是非静态的,他们不是简简单单的去加载了,他们因为没有名,所以直接呢就执行了,是这样个情况,好了再接着去看,我现在呢,再找个对象,我找俩对象,我再执行一下,你看。
13:17
你会发现呢,我每造一个对象呢,这个非静态代码块呢,就都执行一次,而我们这个静态代码块呢,是不是就这执行过这一次啊,上面这个这个这之前咱们写的点把这个关掉吧,老时看这个叉有点不舒服是吧?嗯,这个静态的代码块呢,我们会发现呢,它自始至终呢就执行过这一次啊,你可能会想说,诶,那我会不会说我再通过这个类呢,我去比如说点一下咱们刚才说这个因符方法,这个时候呢,他执行了一下,说会不会我们这个静态代码块呢,又执行一次,哎,然后呢,想多了没有,诶那这里边我们要再说的一个点呢,就是这个静态代码块随着类的加载而执行,而且呢,它只是会执行一次,执行的这一次呢,就是你类加载的这个时候。
14:09
啊,随着类的加载而执行,而且只执行一次,只要你当前这个类没有重新加载,我就不会重新执行,就这样子的,那么这个呢就不一样了,非静态代板块说随着对象的创建而执行,那我们再多写一行就是,而且呢是每创建一个对象,哎,就执行一次非静态代码块。我每创建一个对象就执行一次非静态代码块,那就相当于我造这个对象的时候,这个非静态代码块呢,是不是可以帮我们做点事啊?所以说这里边呢,就自然而然的就提出来了,我们这个非静态代码块,它它的一个作用,其实上面呢,我们也说了他们的这个作用了,只不过这时候呢,说的稍微粗一点,对于这个非静态代码块来讲,我们每造个对象呢,它就可以去执行一下,你想想我们在这个非静态代码块里边,咱们其实呢,是不是可以考虑对我们创建这个对象的一个属性,比如说负负值是不是就可以考虑了,比如说咱们刚才的用的这个是空三的构造器,我造的对象按说呢,像name和age呢,都应该是默认值了,但是我在这个里边呢,我来一个A值等于一,我负了一个值。
15:34
附了一个值以后,我这个时候呢,你再去打印一下我这个p1.a值,这时候咱们这个权限呢,我没有设置,所以我可以直接来调用一下这个属性啊。走你看这时候呢,就有一了,因为呢,咱们在非静态代码块当中,对这个属性呢,进行了一个复制操作,所以说呢,咱们这个非静态代码块,它是跟这个对象相关的,它的作用呢,就是可以可以在创建对象时,对对象的属性进行初始化。
16:10
对这个对象的这个属性等进行初始化,进行进行初始化,因为呢,我们每造个对象呢,你可能都要考虑这个对象的这些属性是什么样子的,所以呢,我们每造个对象呢,它就都执行一次。相当于咱们关于这个属性赋值又多了一个位置,前面呢,咱们都讲过哪些位置可以赋值啊,对属性可以赋值的位置,首先呢,那时候提到过,是不是有叫默认初始化,还有显示初始化,对,然后构造器中初始化,还有这个有了对象以后,可以对我们说通过这个对象点属性,这个能不能点属性就看人家权限了,或对这个对象点这个方法的方式。
17:19
这个进行赋值,那相当于咱们现在呢,又讲了一个位置,是不是相当于说在代码块中也可以进行一个赋值啊。诶,那么一会儿呢,我们再谈一下,到底这个代码中,代码块中赋值应该是放在哪个位置更合适,这是咱们一会儿要说的事儿,现在呢,至少可以说在代码块里边呢,是可以进行赋值的啊是这个问题了,这呢咱们提的叫非静态代码块它的一个作用,那对应的这个代码块,呃,这个静态代码块它的一个作用,那也就很好说了,那它呢是随着类的加载而执行的,那是不是就可以去初始化我们当前类的一些信息啊,哎,那就比如说你这个类的一些属性啊,我们这里边呢,你看我就有一个静态的一个属性,那么我在这个静态的代码块里边呢,就可以去调用这个结构了,比如说这个DEC,然后我对它呢进行一个重新赋值,上面说我是一个人啊,我是一个爱学习的人,其实好像没有。
18:32
很爱学习是吧?嗯,就是你需要生存,所以你需要不断的去学习才行,当然了,学的过程当中,顺便呢,可能也确实找到一些兴趣,这样啊,没有兴趣呢,去干血那还是挺痛苦的,我这呢,对这个属性呢,又进行了一个重新的复制,重新的复制以后,我们再过来看一下我们这个dic,我这呢作为一个输出,OK,诶你会发现呢,这是我是一个爱学习的人,就相当于我们对这个类中的静态的属性进行了重新赋值啊,就是这样的一个情况,那基本上关于这个代码块和非静态,非静态代码块这个功能呢,我们就算是说清楚了,但是再补充一些细节,细节什么呢?这个静态代码块我们在一个类当中没有说只能定义一个。
19:22
那就意味着可以定义多个,那我这呢就再多写一个,这呢是一个static,再来一个。又写一个,写一个的话呢,我们把这句话CTRLCCTRLV,这个呢,我叫杠一,这个叫杠二。那么很显然,我要是去执行的话呢,是不是他俩都应该执行啊,对,都应该执行,那你说他俩执行的先后顺序是什么呀?哎,这呢,我们是先看到杠一,后看到这个杠二的,那我要是把它呢放到上面呢,那就先二后一了,所以呢,它的呃,谁先谁后,其实很好说了,就是说如果呢,我们在一个类中定义了多个静态代码块,那么就按照它声明的先后顺序去执行。
20:15
如果一个类中定义了多个静态大板块,那则按照声明的先后顺序执行,这是关于静态代码块他们之间谁先执行,谁后执行的问题,那么静态代码块和非静态代码块之间谁先执行,那肯定是静态了,因为人家是随着类的加载而加载的,所以这个呢,我们也明确说一下,说这个静态代码块的执行,它呢要优先于非静态代码块的执行,那也就是说呢,你别看你下边这个非静态代码块我写到下边了,你把它扔到上面。
21:08
那也不会说是先执行你非静态的了。其实这个想都能想出来,我上面这个时候呢,根本连对象都没有的时候,你非静态的也不可能执行,所以肯定还是静态的,要先执行的行,那这呢是非静态,那我非静态要写多个呢,那是不是也也应该按照一个先后顺序执行了。对的,这个呢,我写个杠二。保存一下这个看着稍微有点这个乱糊了是吧,这是我们造的第一个对象执行了,这一次我们再来执行啊,这呢就是先后这样直行,这是造了一个对象,这是造了个对象。哎,这样一个情况,行,你把他俩呢颠倒一下。这样保存再来,这样就颠倒过来了啊,所以这个呢也合情合理,这儿就是如果一个类中定义了多个非静态代码块,则按照生命的先后顺序执行,那他们整体上呢,都是要晚于这个静态代码块的执行的。
22:20
这个没啥可说的了,就是我在上面写了,这就不用多写了,OK,这呢,我们是说了一下有多个的情况,但是一般情况下,咱们在开发的时候呢,如果你要是用到代码块了,那就可以定义,但是呢,嗯,一般的都不会去写多个的,你说我这写了一个,我又写了一个,他俩还先后执行,那你就合成一个不就完了吗?这个静态的,你写了俩,你把这俩合成一个不就成一个了吗?没有必要非得造成俩。它跟方法不一样,方法的话呢,你看我们要写个方法,我这写个方法,这几个方法,这几个方法写了仨方法,然后我们调的时候呢,我也确实先掉它,再掉它,再掉它,有的同学说我把这三个合成一个不就完了吗?
23:01
这这不太一样对吧,方法的时候呢,咱们给它你要把一个大的方法拆成三部分了,这个我们有时候还要鼓励这样去做,相当于我们把这个代码功能给它解耦出来了,因为后边呢,你这独立的功能,你可能以后呢,你调了它没有掉它呢,只是在你当前这个问题中,你掉它了。就是当前问题,你可能掉它了,又掉它了,又掉它了啊,那你换到另外一个题,你可能掉了第一个,我接着就掉第三个了,就是我们把它拆成一个一个方法以后呢,这个使用起来就更加的方便了,但是你代码块这块呢,连个名都没有,你也不能说自己很主动的说我调你一次啊,一会又调别人了,没有这个权利,因为他本身呢,就是该在什么时候执行,他就一上来就都执行了啊,所以说呢,通常咱们也没有必要呢,去造多个对多个静态的,多个非静态的,这个稍微理解一下,这是咱们开发商的一个实际使用当中的一个情况了,这个大家注意一下就可以了,行,那再说一个问题,你说我这是一个静态的结构,我里边呢能不能啊,属性这块说了能调这个静态的属性,我调静态的方法可以吧。
24:16
下边有个静态音符可以掉吧,可以,我能掉非静态的吗?写个it这就不能了,然后我调一个非静态的,这个内是不是也不可以啊,这个呢,是不是很好解释,对对,我们随着类的加载而执行啊,你这时候呢,是不是根本都还没有这个结构了,嗯,那反过来呢,我们在非静态代码块当中,我能不能调这个静态的结果啊,对,这显然可以,比如说我就写到这了,没问题,然后呢,你要调这个呃,非静态的,呃,调静态的是可以的,调非静态的这是一个,然后我们调一个it也行是吧。
25:04
把这两个写这块相当于这呢,咱们调用调用的叫非静态结构,这呢调的是静态结构,那对于我们这个静态代码块来讲,它呢只能是调用静态结构。哎,这个我是he的人一这样啊区分一下,然后呢,对于非静态结构呢,我们说不可以调用。嗯,那这个呢也很好理解,这呢我们把这个点呢也写上一下,哎,我们说呢,静态代码块内说只能调用这个静态的,呃,属性或者是静态的方法,呃,尤其呢说不能调用非静态的结构。
26:05
嗯,好,然后对于这个非静态代码块来讲。非静态代码块说它的内部可以调用静态的这个属性,静态的这个方法,然后或非静态的这个属性,非静态的方法,哎,这呢都是可以的。行,那从这个知识层面呢,我们把这个静态代码块和非静态代码块,代码块呢,就说说完了,就是关于它使用的点呢,就这样一些。那开发当中我们要不要用代码块呢?可以用,那可以用干什么用啊,就是干咱们刚才说的这个用处,或者是这个用处就是相当于是对属性赋值的时候呢,多了一种方式。啊,那完全呢,你是不是也可以不用这个代码块啊,我就用构造器,我就用显示初始化也可以,所以说呢,从这个角度来看,咱们代码块在开发中使用的情景呢,国家使用的频率呢,不是特别高,哎,不是特别高,那大家呢,但是也要知道代码块该怎么用,为啥呢?因为回头呢,我们后边讲课还要看一些源码,在源码当中呢,我们就会看到一些代码块的身影,它可能是静态的,也可能是非静态的,那你看到源码的时候呢,最起码你得知道一个能力,就是你得知道这个代码什么时候执行的。
27:35
那那就是说这里边儿这个知识点呢,大家还是要懂的,至于说我们开发中去写的话呢,可以不用代码块啊,你可以选择不用代码块的行,这个点呢,我们就先停一下。
我来说两句