00:00
好,那么接着的话呢,咱们来看这个第五个题目啊,这个第五个题目的话呢,你看前面这块我光写需求,在这块呢,我专门呢写了一个零四啊,一般呢,写到这个零几的时候呢,这都是属于知识点了啊。嗯,这块呢,我们相当于通过这道题目呢,给大家讲一下啊,一类特殊的数组叫做对象数组。哎,特意的来说一下,实际上来这个概念的话呢,对应的这个题目呢,我们也见过啊,只不过没有明确的把它表示出来什么意思啊,你看啊,我说呀,我定义的这个死string类型的数组啊。实际上呢,就可以理解成叫对象数组了。哎,首先呢是个数组,其次呢,这个数组的元素呢,是一个引用类型,而且是个类类型的,类类型的元素,那不就是对象吗。哎,那不就是多个死锥形的对象构成的一个数组吗?这不就叫对象数组吗?啊哎,所以呢,上来问说何为对象数组呢?啊,这个我们看一看这个笔记也行啊。哎,在这写的说呢,数组的元素。可以是基本数据型,也可以是引用数据型。
01:01
那如果元素呢,是引用类型当中这个类的时候。啊,那你具体这个元素的那个实打实的值不就是个对象吗?哎,我们就称为呢,这就叫做对象数组了。哎,就是他啊。哎,其实呢,也没什么太特别的啊,只不过呢,大家呢,在处理这种对象数组问题的时候呢,可能有点懵,所以呢,咱们专门呢拿一道题呢,来给大家去讲解这个事儿。OK啊。好,那么具体这个举例的话呢,像磁针形的数组,包括呢,我们诶,可以单独的造一个person的对象,那就是一个对象了,我把这个呃,造好几个对象呢,统一的放到一个数组当中,那就是对象数组。啊,比如说有学生,那就是学生的数组,这就是对象数组啊,再比如说呢,我们像这个比如客户。啊,然后客户多个客户构成一个数组啊,也是对象数组等啊都是啊。哎,都没问题。好,下面我们通过一道题目呢,来熟悉一下这个对象数组的一个操作。
02:04
来看这个题啊,这个题呢是这样说的,首先的话呢,我们定义了一个类叫student,里边呢有三属性。嗯,其实也没啥了,就主要提这个属性的事儿,方法呢没提啊,下边说呢,创建20个学生对象。那你长个容器呗。啊,单独造20个对象,然后一个叫STUDENT1啊,一直点点点到STUDENT20,这个管理起来呢,非常的不方便啊,所以呢,我们统一的放到一个容器里,到目前为止就讲过数组,所以呢我们就放到数组里边,呃,下边呢,涉及到关于这些诶,每一个对象的属性的赋值的问题了,然后这呢是两个需求。啊,就这样的好,那我们一个个来,首先呢,看第一个事儿啊CTRLC。好在这儿啊,新建一个类。Student。哎,没问题啊,关于他的描述放这儿了。声明三个属性。哎,首先啊,这个in型的叫number。
03:02
啊,这个I型的state。啊,然后in的score。哎,就这样啊,这个叫成绩。哎,年级。哎,学号。嗯,没有提方法的事儿,那暂时呢,我们就不考虑这里边儿呢,去定义方法了先啊。哎,接着回来说呢,创建20个学生对象啊,学号这样这样这样这样,然后这样这样这样好,我把这个事儿呢,CTRL塞一下。哎,这呢,我们就创建一个。哎,不妨呢,我就叫做student的一个测试类了。往这粘过来。哎,这个按一下tab键啊。好在这儿没方法进来啊,回车OK了啊。嗯,首先呢,这里边儿啊,提到了这样一个需求,创建20个学生对象,我们把它放在一个容器里边,所以先把这个容器数组创建出来。
04:00
哎,创建一个。哎,是不是死掉的类型的数组是吧。这个用动态初始化吧。对的啊,先来指明它这个长度了,然后接着呢,我们是使用循环是吧。呃,然后呢,给数组的元素哈,诶,赋值记着啊。好,那么相当于每一个数组元素的位置呢?我们去给他一个实打实的一个student啊。呃,然后呢,你用的这个词呢,它的属性呢,都是默认值,呃下一个问题呢,就是呃,你创建好的这个学生对象,呃,它的属性啊,年级啊,学号啊,给附上值啊。啊,这儿呢,说给。哎,每一个。学生对象这个。啊,提到了,刚才有这样的。哎,几个属性啊,给我们。哎,写一下啊。这个scar。诶,这三个呢,属性赋值。
05:02
认就可以了,行,那么这样的话呢,我们这个数组啊,就算是完成了。数组里边有很多的学生,每一个学生有对应的一些属性信息。好,然后再后边呢,就是他这个题目的一个需求,第一个问题,让你做这个事儿。啊,这是他的一个需求一。哎,然后接着需求二。哎,做这个事儿。啊,CTRLC来,我们过来。好,这呢就是整个我们这道题目的一个思考的一个流程啊。好,那么就一个来,首先第一个啊,创建学生数组。Student。Students吧,哎,体验这是负数啊,一个容器嘛。New still,这样是吧。20个吧。这块呢,如果你要是说A自定义类这块整的感觉有点懵的,哎,你就这样啊,你要不清楚,你就想象这是个论。
06:03
啊,Student跟STEM不都是类吗?哎,String的话你不就得这样写吗?说这个,哎,Sts吧,哎,你有一个string形的数组,长度是20,哎,这不一样的套路,你把string换成student就可以了。嗯,好,这个完事了啊哎,下边的话呢,我们通过一个循环的方式呢,给数组的每一个元素呢,去赋值啊报一下。哎,Students。哎,里边怎么写。16单词。I是吧,哎,右边哎你。A student。那那么问我,一圈循环下来,你有多少个?20个对,而且一定要你有20个啊。啊,你看我这样写对不对啊。还没写呢就说不对了,哈哈,嗯,抢答了都哈。
07:00
其实我我刚写到这开头的时候,我还是有机会给你写对的哈。这样行不行?这样呢,会是什么问题?对,就是嗯,我这样问啊,呃,我们对空间中有几个学生实体的对象。啊,一个哈,那我们这个数组的元素哈,一共是有20个这个元素的,这个这个位置哈,是不是都飞空。再说一遍就是堆空间,我我可以现在不画这个图哈,堆空间这个数组一共是20个元素,每个元素的那个它存的位置啊,是不是都是非空的,不是闹。飞不飞?对,都非空,你看赋了值了吗?是不是每个都负了是吧?诶,都非空,只不过呢,大家的这个地址值全一样。
08:02
都指向了唯一的一个对象实体是吧。对,所以我简单要画个图的话呢,比如说这是这这是对,然后呢,这个诶我们不是在这个main方法里边造了个数组叫students是吧?哎,这不是指向了你这个20个。改点点了啊20个,然后呢,诶,其实本应该呢,是每一个位置我们去拗一个的啊,但现在没有,我就提前了,先造好了,先造好这个呢,其实你也可以看到这是Su,这不是在这个方法里边定义的一个优变量嘛,是吧?哎,他这块呢,先去用了一个这个学生对象,然后呢把这个地址啊。把这地址是依次付给这里边儿的每一个变量了。所以大家呢都一样,那就导致了所有的大家呢,都指向他。哎,都这样,他。这个呢,显然跟我们这个题目呢是相悖的哈。诶,不能这样做,就是你要是去呃获取这元素,再打印他的年级啊,成绩啊等等都有没问题,但是大家全一样啊,就这一个。这是错误的啊。
09:00
所以呢,你得这么着。哎,这样啊,把他那就删掉了。这儿呢,才是实打实的20个你20个学生啊。嗯,这个完事了,然后接下来啊。呃,给学生赋值的这个事儿呢,其实我们在造一个对象的时候呢,就可以给他赋个值了。所以我就写到方形万里了啊呃,每一个学生呢,你就可以通过角标的方式呢去调用一下了。呃,首先呢,找他的这个叫学号是吧。这里边儿提到说学号呢,有一到20。对,I加一就行啊。这个是给学号复制的,然后呢,是这个成绩啊。啊,年级。这个叫state。这个年级呢,是从,嗯。啊呃,我看看这块这块有说吗?也没说从几年级到几年级啊。啊,这哎。行,就按照这个里边的提示吧,一年级呢,就一年级到六年级,那这个咱们讲随机数呢,是不是大家已经都清楚了啊,B减A加一,这就六啊,再加上A那就它啊C。
10:04
这个我们就放这了。哎,年级有了啊,然后接着他的成绩。哎,啊。诶成绩在这块还是根据这个提示吧,诶零到100分B减A加一啊,这就是101,再加上这个A0啊就忽略了,就他。哎,就这样。哎,这那就附上值了啊。好,那么目前呢,如果我们啊,脑海当中大家浮现一个图的话啊,内存结构啊。哎,这个呢,就是students指向对空间,哎,我横着放吧,有20个。点点点啊20个每个位置呢,都指向了一个学生对象,哎,每个里边呢,都有一个有个state,有个score,各自呢都有相应的这种值。哎,每一个都如此啊,第二个实际上是这儿啊,第三我放这儿吧,一共呢有20个。OK,没问题啊。好,脑海当中要浮现这样的一个结果了,诶大家刚开始写代码呢,诶建议呢,你写着写着感觉哎呀这个代码已经自己hold不住了,诶稍微停一下,你看看内存现在到什么场景了。
11:08
哎,等以后写的多的话呢,就不用了。啊,写代码这个是我们写的过程啊,心中呢,想着这个图啊,胸有成竹是吧。啊。好,这个呢,我们就完事了啊。那接下来看下边这个需求。说打印三年级啊,就STAY3的学生的信息。嗯,那这就得写个for循环了是吧,电力啊。哎,students.less啊来判断一下啊,叫三年级嘛。哎,我找students数组每一个位置的学生的state是吧?哎,如果要是三年级,我就把它输出。哎,答应这个学生的这个三个属性是吧。哎,打印一下。啊,这个位置呢,我们其实也可以呢先。哎,我先这么着一下啊。哎,这个我们。
12:01
诶诶,我想想想炫一下呢,诶出来了。啊,这样哈,行。这个因为以前我用eclipse的快捷键呢,用的太顺了啊,包括呢,一开始我在用idea的时候呢,我也是把它全部改成eclipse快捷键了。啊,现在呢,毕竟大家都用idea,那我就是熟悉idea快捷键了,所以这块有时候还没倒过来哈。嗯,这个呢是这样的,有的时候咱们写代码的时候吧,比如像刚才这块啊。我我把它先删了啊,哎,这不写了一个输入语句吗。现在光标亮在这儿,哎,突然想,诶,我想在这一行语句的上面再写一行代码。哎,你你说哎,我把光标放这儿,我一回撤啊,这当然不是感觉比较low嘛。哎,怎么办呢?Ctrl alt加个回车,诶,直接就跑这来了。就很方便哈。诶,CTRL加回车啊。行,这个我就来这儿了,我想干嘛呢?哎,我想先把这个数组指定I位上这个元素呢,先给它取出来。
13:00
啊,来一个al回车,啊来一回车。哎,直接呢,这边就给我们,诶这样就行了是吧。嗯,S tuu好一点啊。好,然后呢,我们就去打印啊,他这个。嗯,先这样吧。Number。冒号吧。哎,加上。点number。逗号一下这个state。冒号。加四,然后呢。这有点长了啊。哎,这么着。哎,逗号一下这个scar。第二诶高诶这样就行了。诶,这不就打印出来这个信息了吗。哎,你要不是三年级,那你就接着啊,这个执行蛙也进不去了,进不去你就接二加加啊,接着走就行了,这就是需求一哈。来跑一下。哎,这就可以了,哎,那因为呢,我们这个年级呢,这不也是随机给付的嘛,这呢,我打了俩,你要再走可能就不止俩,也可能是不够俩啊。
14:07
还是两诶。不,哎,不是还是他吧。没注意啊,刚才啊。嚯,这么多啊。对,就是每次呢,这个就不确定了啊。呃,那这块的话呢,你发现呢,我们去打印这个学生的这个基本信息了啊,其实这块我们完全可以把它放到我们这个里边,定义成是个方法嘛。哎,所以这块我们声明一个方法来啊显示。啊,然后呢,学生的这个属性的信息啊,所以这块我就直接public了。哎,这个话的话呢,其实怎么都行哈,哎,习惯性的话呢,我们写成返回值的了。啊,你也可以写成Y是吧。哎,习惯性的就写成对了啊,这个呢,比如我们叫竖吧。在这里边儿我就return一下。其实就我们刚才写的核心的代码就是它啊。哎,粘过来,只不过这里边儿呢,这个没有S的这个概念啊。
15:04
哎,这样呢就可以了。好,这个写完了,写完以后回过来,哎,就用不着我们每次呢,都自己在这写输出了。哎,ST tu是吧,点第个收吧。这呢是有返回值的啊。这里呢,我们去out一下。可以了是吧。哎,Run一下。哎,这不就可以了啊。行,这块OK吧。OK啊行,这是我们的需求一,接着看这个需求二。说呢,使用冒泡排序,按学生成绩排序,并便利所有的学生信息,这算是俩需求啊,先排序再便利。嗯,简单排序吧。哎,这块我们看看咋写啊。按学生成绩排序,那这个你一定要整清楚,这是数组,这是第一个,第二个,第三个第四个啊,以此类推,每一个位置都是一个student啊。
16:01
第一个学生使用冒泡嘛,跟第二个学生对吧,成绩做比较吧。假如他的成绩呢是60分,他呢是50分。交换是吧,注意啊,你别整错了,我交换的话应该交换的是。两个元素啊。其实这块存的是地址是吧。你应该把这俩地址是不是换一下。你你你别怎么着啊。这个学生考60分得考50分,把他俩成绩换了一下是吧。啊,然后这个学生还是那个学生。那这个就作弊了是吧。这不可以啊,对,你别光换成绩,你得换那个学生啊。所以呢,来吧。Five。这个咱们再来一次冒泡吧。哎,首先确定你循环的轮数是吧。那students点减个一吧。再放一下。这个是students.length减一减,哎,对,这咱们都已经讲过了啊。
17:01
在这里边要写判断了啊,如果。Students。别起来了。接是吧,他的成绩。别晕了啊,他的成绩如果要是大于后边的这个成绩。点是吧,然后我们就交换是吧。交换,刚才我说过了啊。这样写就麻烦了。看一下啊。我就怕有同学这样写。那第24个是吧。嗯,然后呢,这个。哎,点score等于。加一点。你可能是无心的做法,但是你改变了无数的学子的命运,是吧,嗯。哎,这个谈判。显然是错的是吧?对,所以呢,代码的话你别看,诶这个你看没没报错挺好的是吧。哎,只能说语法没错啊。
18:01
这个是错误的啊。这个错误呢,不是语法错误,是不满足这个实际的需求啊。这个不行。好了。那么接下来应该怎么做呢?哎,对,正确。的是吧,这个时候呢,你应该是诶临时的是一个学生的一个对象啊啊,他呢是呃,Students接是吧。哎,Students这个接。哎,姐也加个一啊。哎,应该不会有同学认为说,诶上下两个好像是一样的吧。别别这样是吧,那那就只能画内存图了啊啊,这个呢,实际上是正确的,我们要交换的是你这个数组中两个存储的地址。哎,换一下啊。诶换上以后呢,你后一个不就更大了吗?哎,那你接着呢,再去这个接加加是吧,诶再接着去比走走走走,诶这不就完事了。
19:05
可以了就啊好可以后呢,我们下边呢,来一个便利啊。啊,这个呢,就简单了啊。Students第二。里边我们就直接students。哎。点瘦是吧。哎,咱不是刚才有那个方法写好了吗。啊,点再输入一下是不是就可以了。哎,这个呢,我写成叫哎排序后。哎,它的一个变,哎排序后的一个便利,哎,我把它呢CTRLC在排序之前,咱们呢也遍历一下啊。好,这个就完事了,走一下,嗯,这块我们来一个。线吧,要不他这个。看不出来。这个这个从哪分隔了啊。这个稍微有点长了啊。嗯,从哪开始,从这开始,应该前面这都是三年级的啊。
20:00
呃,上一个需求啊这块呢,NUMBER12351直到20,然后呢,这是他们这个state,这是他们这个成绩啊,成绩呢,这就没准了都啊。行,然后呢,我们对排序完以后呢,我们按这个scar啊,这个这其实咱们相当于是一个均匀排序,均匀分布是吧。对啊,所以这个你看这个。正常来讲,考试都是个正态分布,这呢咱们是随机数码均匀的啊。哎,这呢,就是他的一个成绩没问题啊,咱们随便挑一个人。你别给人家整的这个。整差了是吧?嗯,他考了40分。在这儿你看你得看一下,还还得是他啊。没光光感成绩是吧。啊,其实呢,是对的啊。嗯,行。那这呢,就我们这道题的一个做法。啊,就写完了啊好,这个写完以后的话呢,长舒一口气,诶,我们下边有一个。拓展。哎,看看这个拓展啊,说呢,能不能把刚才我们操作student的这个相关操作,诶,我们再体现一个方法的使用封装起来,造成一个工具类思考一下,一会来了,咱们写一写。
21:05
好,那么刚才的话呢,我们抛出一个需求啊,说呢,能不能我们提供针对于student这个对象数组啊,提供它一个工具类封装一下呢,我们对它的这些常见的操作了,那针对于我们这道问题的话呢,我们看一看啊呃,这里边儿涉及到我们有这样的需求,比如说呢,诶便利一下我们这个学生数组。是吧,诶我们看能不能写成个方法是吧,以及的话呢,这块提到一个需求说诶我们呢想打印,呃指定某一个年级的学生信息,诶说这块呢,要有通用性的话呢,是不是可以考虑把它呢也封装成个方法。哎,包括下边呢,针对于这个学生的一个排序是吧,学生数组的排序,这个呢,也同样道理。那实际情况的话呢,只要呢,你这个需求啊,诶可能会经常性的做,只要你经常的做呢,我们就可以考虑呢,把它封装到一个方法当中。啊,OK,或者换句话说呢,即使你不经常做啊,那这边大家你看一看,当前呢,我们写这个酶方法啊,你看这个代码量呢,其实就有点儿多。
22:04
里边呢,哎,都是一块一块的功能,而且这些功能呢,你发现还各自都不一样。诶,那代码要放在一起呢,我们几个词儿叫耦合度高哈。哎,这个偶。哎,其实我感觉我为什么不打出来呢。是吧?这个耦合度高啊,这个耦合的话呢,就是相互之间呢,就是。怎么说呢?知道这个耦合吧。啊,你懂的是吧,对对,就就你那个都混到一起了是吧?诶我们最好呢,给它分离的一下,分离一下啊。我们在写代码的时候呢,其中有一个指标呢,就是尽量让这个代码的耦合度低一点啊,那我们就可以呢,把这些一个一个的需求啊,都分拆成一个一个方法,然后在这个main方法当中,你就分别呢,哎,测试一个一个的方法就可以了,这呢就我们这样的一个想法,那这样的话呢,我就把这两个啊CTRLC一下,咱们就放到下边这个里边了。哎,我CTRLV一下啊粘到这儿。
23:01
好站到这儿的话呢,哎student呢,还是当初的那个student,那基于这个student呢,这块我首先呢,提供一个哎操作student,哎数组的一个工具类了,啊这个不妨我就叫做student的一个叫YouTube。工具类哈。好,那么这个工具类里边呢,我们提供什么样的方法呢?那主要呢,取决于我们刚才在这个测试里边,我们需要做什么样的事儿。呃,那这个呢,是给这个数组元素赋值,嗯,这个呢,其实你要非要想把它也封装成个方法呢,也行啊,咱们先先不考虑它啊,先放一放。呃,然后再往后的话呢,这块提到呢,说打印指定年级的学生的信息了。那这个事儿呢,我们其实可以呢去处理一下的。啊,这个我们就。哎,这样啊,列出来一个方法。呃,这是它的一个需求啊,我把它呢CTRLC诶粘过来啊,这我写成是一个多行注释了啊,这个呢,我们就要打印。指定的年纪了啊。哎,指定年级的学生信息。
24:03
哎,这么着了,哎,首先呢,你看我们设计一下这个方法的这个声明啊。嗯,Public这个返回要吗。嗯,那看你怎么看待了,你说呢,嗯,把这些比如说还是三年级吧,把这个三年级的学生呢,你给我放到一个数组里边返回。这是一种想法,另外一种呢,就是你直接就给我打印了。哎,你要直接打印就得了,这就Y了是吧。啊,这个我们比如说就叫做啊指定的。啊,指定的怎么说呀。哎,这个就要打印,这样说吧,哎,打印这个丢。单词是吧,然后with。怎么怎么叫指定呢?With。指定的这个index这样啊。啊,这样好,那首先呢,你告诉我你想打印的是哪一个,呃,学生数组里边的,呃,什么样的信息的是吧?呃,所以呢,首先把这个学生的数组呢,先抛过来。
25:06
哎,比如说就叫这个名了,指定的这个state吗。啊,这个位这个state吧这块。哎,这样好,这个就写到这了啊,那具体里边这个设计方式呢,就跟我们刚才呢,诶你做测试的时候呢,这个就类似了啊,我从这到这呢,我CTRLC一下。粘过来。这个数组呢还是这个数组,这呢不是三了。哎,是这个state。嗯,然后这块呢,这个我们就不要了啊,CTRL一下删掉,然后在里边呢,我们就直接呢去输出它了,所以这块呢是个avoid了。行,那这个写完之后呢,你看回过来到这块,咱们就不用直接这样呢,去写这个for了。哎,我想调一下刚才这个方法是吧,哎,调列方法的话呢,我们需要首先创建这个student YouTube它的一个对象嘛。哎,好个对象,好,那拿这点我们叫print students with state,把这个学生这个数组呢,放进来三年级嘛。
26:02
哎,这个事儿这就完成了。OK啊,好,这块我们做一个run。嗯,来这个下边咱们这边还有别的操作了啊往上走,哎,这边就是三年级的这个事儿。哎,是没问题的,行,那这个呢,我们就搞定了下边这个需求呢,冒号排序,然后呢,便利啊,这个便利这个事儿呢,也可以封装到一个方法里边。回过来。啊,咱就直接public。哎,Or,咱直接呢,就print students了。这么着,哎,你想便利的是哪一个学生数组,这个把数组呢传进来啊,回到刚才的这个这块啊,把它呢CTRLX了啊。哎,往这一放,是不是直接在里边就是变利了。哎,我就简单了啊,叫便利指定的,呃,学生数组。好回过来,然后回到这儿的话呢,我们就直接呢,通过咱们上面这叫AU点,哎,我去调这个print这个方法,把这个学生的数组放到这里边,哎就可以了。
27:06
好,然后呢,诶,当你这块排完序以后,我们最后呢,再去做这样的一个操作。这不就行了吗?嗯,OK啊好,这块我们再做一个run。在正常地方,你看打印呢,其实是没有问题的,都啊都可以。好这个就过了,然后下边这块呢,提到一个,哎,针对这个学生数组,按照成绩呢,进行一个冒泡排序,代码都在这儿,我们也把它抽出来放到我们这个里边。哎,Public排序嘛,排完序就结束就行了,所以是word啊,这个我们叫sort一下,哎,Students啊,针对于students的这个数组。哎,做一个排序。好,那么还回过来找到这儿。诶,从这到这啊CTRLX。拿走。啊,回过来CTRLV啊,粘过来这块我就不要了啊,CTRLY删掉。嗯,这个呢,就是对它进行一个排序的操作了,行在这写一下啊。
28:04
说呢,哎,针对于啊,咱们这个叫哎学生数族。哎,水生宿组按照。这个成绩。那属性哎,从低到高排列啊。哎,OK啊,这有一个排序操作好,这个写完以后呢,回过来啊,在这块呢,我们就直接呢,诶通过这个叫哎U点,诶我们去调这个叫salt方法。哎,把我们这个学生的这个,哎往这一放。就可以了。好,那么这时候我们再去做一个run。嗯,看一下啊,这呢是他一开始的这个场景number呢,这是一次递增的,然后下边这块呢,我们是给他排序以后的这个行为。哎,是没有问题的,诶跟刚才呢,我们做的这个呢,效果呢是完全一样的,诶但是这时候呢,我们说这个写法呢,比我们上面的写法就要好很多了,那我们就抽取出来相关的方法,首先这块你看耦合度就低了。
29:01
呃,另外一点的话呢,就是整个呢,诶,你要后期还会有类似这样的需求呢,直接调现成的方法啊就可以了。OK啊行,那么这里边儿呢,一开始我们通过一个循环给这个数组呢去呃,元素赋值,包括呢指定这个成绩,这个我就没有封装了,呃,一般呢,这个呢不具备这种通用性了哈,诶我们就临时呢在这儿去附一下就行。哎,如果你说我就想这样做,你也可以把它呢,也封装成这个方法,在这去调一下也行。哎,这个我们就过掉了啊好,那这儿呢,大家去体会一下我们为什么要封装啊这样的一个场景。然后呢,关于对象数组这块呢,其实就算是完事了啊,然后呢,内存这块稍微的我们画一下啊,为了大家更好的去理解一下这个对象数组,我这儿呢,把这个代码呢,抽取了其中的一部分,哎,我们来看一看。好,首先啊,May方法一执行,我们这个may方法呢,作为一个战争呢,它就进来了。哎,这呢,就我们这个没方法。哎,这样啊,好,那么这个X我就省略了啊,接着的话呢,我们在内部呢,声明了一个叫局部变量啊,叫students,就它诶指向了这空间长度为三的一个数组。
30:08
这呢,我就创建一个长度为三的。嗯,这个横着创建。我就这样横着放吧。哎,这样啊。哎,那么这个数组的话呢,有一个首地址值。哎,我想这样创建。也行。只要能摆摆摆开就行啊。在这啊,0X,比如说A12AB啊。诶,再往后拽一下啊好,那么把这个地址呢,付给我们这个占空间的这个students这个变量啊,0S啊ABB。OK,他这样呢,就指过来了。哎,指向他。哎,行,这没问题,嗯,长度为三,嗯,接着还没完事呢,啊这个呢,因为是影类型的,所以这块呢,一开始呢,其实都是no哈。
31:00
哎,这就是闹,哎那么接下来我们通过一个循环的方式,哎,这个你看我一旦呢写循环了,这呢,是不是又涉及到一个变量I的问题啊。对,这个变量I呢,其实也是在我们这个may方法里边定义的,同学说,诶,这个may是在may里边定义,但这个I的这个范围似乎说。更小是吧。他是不是出了for就看不见了?对的啊,呃,这呢,其实我们在这个自解码文件当中啊,呃,如果你要是回头看这个自解码文件,还有这个I,但是这个I呢,它会明确一下,它是从第几行到第几行有效的。哎,他不像我们这个students啊,这个students他会明确说他从这一行开始,一直到我们这个main结束,它不都有一个那个行号吗。哎,他会说呢,从这块儿有效,一直到这块呢,到这块结束,而这个I的话呢,他会说呢,是从这块有效到这块结束。啊,这个就是比较细的问题了啊,哎,那就意味着你要在这块想用这个I呢,它其实是失效的状态啊。行,这咱们要写的细的话呢,这个I呢,一开始这个值是零,然后呢,你这块呢,呃,依次呢去扭,扭完以后呢,这个加一等等等等等,它就不断的变化了,是吧,这个我就忽略掉它了啊。
32:02
好,接着我们再说,嗯,总之的话呢,我们通过一个for循环的方式呢,就逆用了三个对象。哎,这块我们把这个三个对象呢,给它造出来啊先呢是第一个对象,嗯,第一个对象。我们摆放行,这样放吧。第一个对象这个稍微的长一点吧。那第一个对象我们造好以后呢,把它地址呢,付给我们这个students角标零的这个位置啊,这个我们有一个具体的地址。0S8899。比如说就他。哎,往这儿移一下。这个位置这样啊。行,哎哟太短了,行就这样啊,然后把这个地址呢附给我们这个第一个位置,把这个闹呢干掉。哎,这叫0X8899。
33:01
嗯,行,然后通过这个地址呢,我们就指向了,哎,你一开始创建的这个对象了,有这个有点斜度啊。行就指向他了,哎,然后呢,哎,我们此时呢,这个student呢,它对应的里边有三个属性啊,State和score,哎我们把这三个属性呢,还得声明出来。Number as state。Scar。这个再再小一点啊。嗯,OK,行,这个呢,就是这样子的,然后一开始的这个值呢,因为都是in的类型了,所以都是零,这个我就忽略这个事儿了啊嗯。这个全是零,好,这个我就先忽略掉它了,然后下边的话呢,我们又来一个for循环,然后给第二个呢,依次呢去赋值,所以这块我们其实呢是造了仨,所以我们感觉这样放有点。
34:03
白腾不开呢是吧。我怎么整一个横着的呢?这也有点紧张啊。往这儿放。哎哟。这个位置这样稍微的给它动一动啊。这个让他跑这。这个小红点儿呢。有点费劲了。干掉他。这个我我我我就我就这么着了啊。嗯,好,然后呢,下边这我们又造了其他的这个对象啊,这不意思呢,都是指向你这个,诶创建的这个对象这个实体了啊。嗯,这样子啊行,然后这块呢,肯定就都不是闹了,哎,对应的都会有一个这个地址值啊行,具体这个地址呢,我就不标了啊哎这呢,一开始这个值呢,全都是。
35:07
写上吧。这个在这儿。诶诶,我我这个我就暂时先不写了,这个咱们就直接给大家写具体的值了啊,像一开始的这个默认值呢,这不全是零啊。你看这是零零。这是零啊,其实这块也是啊。全是默认值,然后呢,诶这块我们在显示的调这个角标零的这个位置元素,把它附上这个真正的值,诶我就不写一开始的零了啊,直接我就把这个写上了,这是五,这个呢是78。诶这样啊行,那目前呢,我们在这个内存当中啊,其实呈现的就是这样一个效果啊,就这样个情况啊,所以大家呢知道诶我们这块呢,一定得去NEW3个啊这呢才是三个具体的学生啊梆呢把哎我们这块也讲过啊,把这个拗的方式呢,拗的操作呢,放在放到外面了啊,就拗了一个对象,那显然是不行的。在这呢,就我们这个内存的一个结构啊,大家呢熟悉一下好,那么这样的话呢,我们把这个对象数组这个事儿呢就说完了,通常呢,大家在刚开始接触这个对象数组的时候呢,处理起来呢,并不是特别好,甚至呢,有同学呢,一度呢把这行代码都忘了写了。
36:11
哎,如果要是忘了写的话呢,此时会出现什么问题?哎,这呢,就是我们典型见到的在面向对象当中的空指针问题。对,因为呢,每一个位置呢,是不是都是闹啊,哎,你在闹的情况下呢,你去调它的这个属性啊,那没有指针嘛,不就是空指针吗。诶,那当然有同学说说,诶这块为什么我们还能点出来呢,不是都已经空了,怎么还能点儿呢?诶在语法上呢,我们编译器看到的呢,就是诶你这你这是一个student类型的,只要是这类型的,我们有这个属性,我就让你点出来了。当然呢,你真正运行的时候呢,这个属性对应的这个值有没有呢?我运行的时候我才知道的。诶,所以这块呢,我们在编译的时候呢,并不是过,并不会给我们报错,真正在运行的时候呢,才会抛出来是一个控制人的问题啊,23行是吧,一上来这块就是一个闹啊,这个问题呢,诶在我们面向对象当中呢,会出现的非常的频繁,呃大家呢,经常见,见多了以后呢,你发现呢,你就特别亲切是吧。
37:12
只要你看到它呢,你就特别说哎呀控制针啊,那我就看看哪块空了啊,关键的就是找哪块空了,它的这个解决的问题的思路呢,是极其清晰的啊,就是呢,拿一个no的值去调了属性,调了方法了。OK啊。好,那么关于对象数组,咱们就说到这儿。
我来说两句