00:00
那么我们通过上边这两个内容的讲解啊,稍微的我们从宏观上呢,再去看一下啊,诶需要大家落地能够啊搞定的啊,能够掌握的是什么呢?就是从宏观上来讲,你得知道啊,咱们要想实现啊,用面向对象这种思想呢,去设计程序的话呢,咱们首先呢得看看,呃,你当前完成这个功能,这个类存不存在不存在,我们得去创建这个类,所以第一步呢,得去造个类,造类的话呢,其实就是设计这个类的成员了,就是属性和方法。诶这个完了以后呢,第二步呢就是造对象,哎第三步呢,就是调属性,调方法,然后呢,我们也看了看,在内存当中,哎这个造对象调方法啊调属性这个过程是什么样子的,诶关于调方法这个事儿的话呢,诶咱们在这儿是吧,这个呢,咱们稍微的靠后一点去放啊就是讲到方法的时候呢,我们再说一下具体的这个问题。关于属性这块呢,我们已经说的比较清楚了。啊,那么回过来我们具体再看一看这三个步骤当中的第一个步骤。啊,实际上呢,这三个步骤当中啊,我们说你花时间最多的是哪个步骤啊。
01:02
就是就是第一个是吧,对,就跟咱们说呢,设计这个呃手机一样啊,哎,其实这个手机这个图纸相应的一定要设计出来以后呢,接下来你就是灶的问题了哈,这个应该都还好,或者说呢,第一个步骤呢,是最具备含金量的哈。所以说呢,你像苹果公司,它主要呢,就是把握了第一步是吧,然后第二步啊,第二步的话呢,就是交给富士康了,第三步呢,就交给咱了是吧。那咱们就是使用呗,是吧,哎就这样子的啊,诶所以第一步的话呢,是比较核心的啊。啊,这个以前美国都想,包括咱们我记得啊,我上那时候高中的时候这个。讲历史啊等等这些老师还说啊,说这个就像美国这不是属于发达国家嘛,哎,他自己呢这块呢,就外包外包这个制造业是吧。啊,觉得制造业呢,就比较低端嘛,啊,就咱们呢,那时候发展也不行,咱就接了这些低端制造了,然后他们呢,就把控了这种高端的设计,芯片的设计啊等等啊这样的一些场景,包括操作系统等等这样的啊呃,确实呢赚到钱了,但后来现在发现呢,这个好像也不是这么回事儿是吧。
02:01
哎,中国这块呢,把这个制造呢,整的就很明白哈,然后呢,制造能整明白之后呢,我们自己就发起对高端的冲击了是吧,发现呢,我们自己呢,可以慢慢的形成一个闭环的时候,美国这块就很担心了是吧。啊,再换句话说呢,这个制造业其实它能吸纳很多的就业人口啊,还能解决就业问题,那你就业问题解决不了的话,这个社会发展也会出现问题啊,所以美国呢,这个贫富差距呢,你发现它就比较大一些啊。OK啊行,这个咱们拉回来啊,但是很显然不管说这个,呃,这个现在又看重制造也好,怎么样也好啊,但是第一步这个设计这个事儿呢,它永远都是比较高端的啊,那我们现在重点呢,就要看看这个类的设计,那类的设计呢,目前我们就讲了俩,那所以咱们就一个一个来看。啊,包括呢,这个怎么去设计方法,咱们都还没说,只是大家呢,宏观上呢,知道这样的一个步骤了,那我们先看第一个关于属性的一个声明啊,所以这块呢,我们就回归到这个爱的硅谷零三这个里边。讲属性,讲方法。好,那咱们方法呢,先不管,先看属性这块啊,对应的这个说明文档就在这儿了。
03:00
好,那提到这个类中声明的这个变量啊,把这个变量呢,我们称为呢叫属性。那从这个角度出发呢,我们再来看一看这个变量的一个分类的事儿啊,呃,那么关于变量的分类呢,我们在。一开始讲到基本语法的时候就提到过了啊,它的角度一呢,我们是按照这个数据类型来分是吧。按照数据类型。百分啊,这时候我们分成了叫基本。哎,数据类型是吧,还有呢叫引用。呃,数据类型那大方向呢,就分成了这样的两类了啊,基本的这块我就简写了啊,一共有八种。啊,没问题是吧,已数据类型这块呢,我就把它具体列一列了,哎,那按照这个咱们讲解的顺序来讲呢,咱们讲过数组了。啊,现在呢,正在讲类。后边呢,我们还会啊,第八章接出一个接口。诶,后边呢,我们还会讲这个5.0的新特性里边这个枚举。呃,然后呢,也是5.0,里边还有一个注解,呃,然后呢,这个JDK我记得应该是14啊,诶里边我们又加了一个叫记录,诶这样一个结构啊,这个现在用的还相对来说比较少呢啊好,那么这呢都属于引用数据类型,这呢是其中的一个角度。
04:06
那么第二个角度的话呢,我们就按照这个变量在类中声明的位置的不同有一个划分。按照啊变料。哎,在类中声明的位置的不同。哎,这呢有个划分,分成什么呢?叫做成员变量。和局部变量。哎,成员变量和局部变量,那咱们,哎这个属性呢,哎,就属于这个叫成员变量。哎,也称为那叫属性了。哎,局部变量啊,大家早上读这个单词的时候呢,局部叫local variable是吧。哎,局部只在局部起作用。啊,哪个局部呢。比如方法内。是吧,以后我们还会讲这个,哎,像方法这个行参啊,构造器内呀。哎,构造器内是吧,还有构造器的型参呀。
05:03
啊,还有这个代码块内呀,哎等是吧,这些呢都属于叫局部变量。哎,简单来说啊,这个你看一下我这个课件里边。我这儿放了一个图,我记得是啊,看这。这个。如果在这个类里边直接呢去生命变量了。哎,方法外边啊,类里边方法外这个呢,就叫做乘以面量,当然也叫属性。哎,你要是在这个方法里边写的呢,这叫局部变量。啊,这个呢,就是角度的不同啊,你像我们这个成员变量啊,是在这儿的啊,哎,那么具体说你这个类型是叫什么呀,是不是咱又可以再分成叫基本数据类型啊。应用数据类型啊,是不是都可以啊。对,所以说注意啊,就咱们这块呢,是这个分类的角度不同哈,就跟你说呢,这个哎人呢,怎么分类呢,说按照性别来分啊,有这个男的呀女的呀是吧,呃,还有其他的是吧。哎,按照这个比如肤色来分是吧,哎,这个。
06:02
黄种人啊,白种人黑种人啊是吧?哎,肤色不一样,那其实你要搭配一下呢,这个黄种人里边这不有男的有女的吗。是吧,哎,这个男的里边呢,这也有不同的颜色嘛。啊,它这个就是不同的角度啊注意。好,以前呢,咱们比较关注的是这个维度啊,现在的话呢,咱们,呃,现在呢,讲这个类的时候呢,咱们就关注于这个维度。哎,就关注这个维度了,好,哎这呢又在哎重复一遍啊,关于这块我们讲的叫属性,它呢还可以称为呢叫。成员变量啊。啊,也叫做这个属性啊,那也可以呢,用这个field是吧,Field这块呢,很多外文的书翻译过来的话呢,就翻译成叫做字段或者叫做域是吧。哎,这个概念了,咱要是中国人自己写的书,或者我们平时自己讲哈,就叫质量。OK啊。啊,其实以后我们要谈属性的话呢,属性其实有专门的一个东西也叫属性的,所以为了避开的话呢,你可以叫成员变量,这个没有任何歧义,就是类里边的一个成员嘛。
07:02
只不过这个成现呢,是个变量了是吧,诶,所以叫成现变量啊。好,那么这块呢,关于这个属性这块我们怎么去熟悉呢?呃,其实这块我们就可以结合着这个局部变量咱们一起讲了。啊来我们这块呢,先举个例子哈,比如说那我就在这儿啊,关于咱们这个field这块了啊,这是讲这个属性的,然后呢,我们在下边我就写到这一个文件里了,我就写个person了。写到这儿了啊哎,这儿呢,我们写的叫属性。哎,属性,比如说我们前面已经写过了string型的name型的age啊,Char类型的gender,诶。这呢叫属性。或乘以面料。好,然后呢,这个嗯,方法内声明的,这就叫做局部变量了,那现在构造器啊代码块咱们还没讲,咱们先不管它了啊啊这呢,方法的话呢,咱们其实也没有具体展开来说呢,呃,先大家知道这样的一个整体的这样一个型就行哈,好比如说这块呢,我想eat啊这就吃了是吧?哎吃什么呢?诶里边我定义一个,比如说诶死顿类型的。
08:06
那叫负的是吧?比如说叫呃宫保鸡丁是吧。英文咋说呀?Chicken是吧,嗯。哎,我喜欢吃是吧。哎,这个加上叫哎负的。也就这样写了。诶,那么在方法里边定义的这个,你看这不有个变量吗?这就叫做局部变量了。哎,还有啊,比如我这块public VO来一个sleep是吧,睡觉啊睡多长时间呢。哎,我在这个位置写了一个参数,这个小括号啊,这个呢,我们称为叫参数了。就跟那个main方法里边,这也叫参数啊,哎,这个呢,参数呢,在准确的点说呢,它叫行参。形式参数啊,它呢也属于。哎,局部变量。啊,这呢,就我们见到的两个特别典型的局部变量啊,然后这个局部变量在这定义完以后,它不是也有一个作用域吗。
09:05
哎,那我就在这里边可以去使用了,那就我们那块写的啊,说诶这个人啊不能少于是吧,哎,多长时间的一个睡眠啊。哎,小时的这个睡眠诶就可以了。好,这这就叫局部变量,这叫属性。啊,先明确一下我们这个位置啊好明确完以后呢,下边咱们主要的目的啊,就是大家呢,去熟悉一下这个所谓的成现变量,或者叫属性跟局部变量它们的相同点和不同点,哎这个呢,整清楚以后,哎属性这块呢,基本上也就没什么问题了。顺便呢,我们把这个局部变量还都得诶熟悉了熟悉啊。好,那么首先说,哎,这哥俩有什么共同点呢?对,都是变量是吧。哎,既然都是变量,那就相当于是变量声明的格式是相同的是吧。哎,声明的格式相同。哎,相同这个格式什么呢?就是数据类型变量名是吧?哎,其实正常来讲,右边还有一个呢,叫变量值。
10:06
哎,只不过呢,有的时候这个值呢,就没有在声明的后边直接就附上。啊,有的呢,可能还有默认值的事儿是吧,但是整个格式呢,是这样的啊,这是一个啊另外一个。哎,我们说一下,只要是变量。啊,就会有。荣誉是吧。哎,这个我们也写上啊,说变量哎都有其哎这个。这个有效的作用域啊。哎,出了作用玉。哎,对,就失效了。OK啊好,那么回过来看一下我们刚才写的这个代码啊。这个我们在E的方案里边,我写了一个负的。啊,那说我喜欢吃这个food的,你要是把这个负的这个调用放在sleep里边,是不是就不考试了。这个呢就报错了,它会提示说你这个我找不着是吧。诶对未定义过啊,他就找不到你这块呢,这变量在哪了,诶因为呢,已经出了你的作用域了,哎这个呢就不行。
11:03
哎,反之呢,你把这个呢,放到上面也一样的道理啊,这个我们是,诶叫编译不通过啊。诶编译不通过啊,说因为啊这个超出了这个负的。哎,变量的作用域,哎,没问题,好,然后呢,你看我们这个属性哈,属性的话呢,我是定义在这个类里边的。那它的作用力呢,是不是就是从这个到这儿。那他是不是就能覆盖我们这个方法。要能覆盖方法,我在方向这调行不行。可以的啊,你看我这块我就输出一下,我就输出一下这个name,等于哎,我就加上一个内。哎,这样写了,那写了以后你看没事儿。哎,我按住这个CTRL键呢,哎,这块呢,说你这个变量在哪呢,我一点就点到这来了,说明就是它。哎,那就因为呢,你的作用呢,能够覆盖啊整个这个方法,所以呢,这块呢,我们说编译呢,通过哈。
12:00
哎,编译通过啊,这个因为呢,我们这个呃内的作用率呢,是在包含了这个方法。啊,覆盖住它了。行,这呢就我们提到这个作用域的问题了,这呢算成是一个相同点啊,就动用作用域啊,出作用域呢就失效了。啊,这个。哎,当然了,这个我们可以再补一个啊,就是凡是这种变量的话呢,我们都得是先声明再赋值啊,再使用是吧。哎,变量。啊,必须先声明。然后副职。是吧,然后呢,我们再去呢,哎,使用。那这个呢,是没有问题的。只不过呢,大家可能会关注到说,诶你这块呢,怎么也没见赋值,你怎么就使用了呢。对,没有负值不意味着它没有值。哎,这就是默认值的事儿了,哎,那这怎么讲呢,这个就是我们看下边这个不同点了。好,来看下边这个啊,哎,除了这三个之外,这仨呢,其实大家做一个了解就行,我们主要还是关注于这哥俩的不同点啊。
13:00
首先第一个啊,说类中生命的位置是不同的。显然啊。哎,或者换句话说呢,哎,不就是因为人家放的位置不同,所以呢,叫的名才不一样吗?你把这哥们我CTRLC我就往这一扔,这不就是属性吗?地位就提升了是吧?啊你把你这个啊,我CTRLC我往这一放,这不就成局部变量了吗。哎,所以呢,就是因为他们的地位不同啊,就放的位置的不同,所以呢叫法才不一样的啊。诶,A中生命位置不同,这让我们稍微写下这个属性呢,就是声明在类内,哎方法外的是吧,这个变量啊。而这个我们说的这个局部变量。哎,他放的位置呢,比较多。哎,就是放在我们这些结构内的啊,哎,所以他呢,我们说哎声明在哎方法。啊,或者这个叫叫构造器啊,内部的这个变量。啊,而方法也好,构造器也好,也属于咱们类的一个成员。
14:00
啊,是你成员的里边了啊OK。哎,这就过了啊,比较简单,下一个在内存中分配的位置是不同的。哎,这个呢,哎,其实也看成是咱们的一个难点吧,反正呢,跟内存打交道的,咱们目前都看成是这个难点了。好,那么这块大家想一想啊,其实我这块呢,也也算是讲到了,只不过没有明确去说哈,你说我们这个属性是放哪的。对,咱们讲这块的时候呢,哎。你看凡是这个属性是不是都放在堆空间里了?啊。变量的。哎,怎么叫求变量,你看我们没方法方法吧。哎,你这个X算P1算P2算P3,哎,这没P3了,下个PP3要有是不是也算。对,只要你是在方法内定义的,这都算局部变量。这里边儿P1P2都算局部变量,所以呢,只要局部变量就应该在。站里面。啊,记住这是一个结论啊,所以属性的话呢,哎,我们说呢,它是随着对象的创建是吧。
15:05
哎,它呢,是存储在。堆空间中。啊,因为这个对象也在对里边是吧,所以他呢也在对里边啊。好,那么局部变量。哎,局部变量呢,刚才明确了,它呢,就是哎存储在哎占空间。记住这个事儿就行。啊,这个结论呢,就是占空间里边放的就是局部变量。然后呢,这个属性成员没呢,就在堆里边把这个结论记住,它也有助于我们以后再去画内存结构图啊。好,下边这个提到叫生命周期。啥,啥叫生命周期啊?对,从你出生到你死亡,这个整个过程叫生命周期是吧?诶所以这块我们会提提这个属性呢,是什么时候出生的,然后什么时候死亡的。哎,是创建类还是创建对象时候出生的呢。
16:05
你看随着对象的创建,存储在对空间中,那你是创建对象之前是不是还没在队里了?那不就还没出生吗?是吧,你说这个类里边不就有属性吗。那不是抽象的吗?说怎么说都是你说了算的是吧,你想咱不是说那个手机图纸啊啥,你这不是虚的东西嘛是吧,我们说这类不是抽象的嘛是吧,你真正有一台手机了,才能看得你摸得着了是吧。哎,才分配内存空间了啊,所以咱们这时候说的这个属性啊。啊,其实都跟你具体这个对象是相关的哈。所以说呢,这它的这个属性,它什么时候出生呢,就是随着呃对象的创建。出生是吧,而创建吧。那你随着对象的创建而创建,然后呢。哎,就会随着对象的消亡而消亡。
17:00
哎,那比如我们就看一个这个内存结构图了啊,那如果我们紧接着我在后边写一行代码,我就要P复制为no。那么在之后的某一个时间,就首先这个指针就没了啊,哎,这个垃圾回收器,如果他要是回收垃圾的时候呢,他就判断这个结构呢,是不是就没有指针指向了,说白了就没有用了是吧。诶没有用的话呢,我们这次就把它回收掉了,回收这个对象的空间,其实就在回收这些里边属性的空间。哎,所以呢,你随着对象的消亡就也消亡了。啊OK啊好,这个拉回来。放到这啊好,这呢,就是咱们说的这个属性的问题,那局部变量呢。诶对啊,它呢是存储在占空间里边的,这个我们说呢,它是在方法内定义的,像咱们说那酶方法,哎,我这个代码呢,执行到这儿的时候呢,这个哎哟,执行到这儿的时候呢,这个没方法不就执行结束了吗。贝伐战争结束呢,这个战争呢,就弹出来了。它一弹出站。那你这个战争都没了,你这个P不也没了吗?
18:01
啊,这叫什么叫,呃。这个叫什么?习之不存,毛将焉附是吧?啊,这个这个整个结构都没了,你这里边儿的东西肯定也就没有了啊,所以诶,当然这个什么时候产生的呢。对,首先呢,战争的先进来,然后呢,随着你这个方法的调用呢,我们这个变量呢,就分配了。啊,这个过程啊,好回过来。所以就变量啊,哎随着哎方法哎对应的这个叫战争。哎,入站是吧。呃,然后呢,这个呃,局部变量。啊,会。呃,这个呃在战中分配啊。哎,这是他的这样过程,然后呢,说随着方法对应的这个战争出战是吧。哎,然后呢,这个局部变量呢,就也消亡了。哎,小王。诶,这呢就是它的一个生命周期啊,这个大家了解就行啊,比较简单,好下面就提到这个作用欲的问题了啊,上面我们说都有作用域,这算相同点啊,不同点呢,就是这个作用域的范围不一样是吧。
19:07
它的这个属性的作用力呢,我们说在整个类的内部都是有效的。而是这个局部变量。哎,对,它呢,仅限于哎声明词局部变量,哎所在的方法。诶或哎,咱们说呢叫构造器,哎这个方法我在这块吧,或构造器,哎或者呢是这个代码块诶。啊,后边这两个咱们还没讲啊,大家就以方法呢去理解就行。中啊。这个比较好理解啊,好下一个,那这个的话呢,我们就不太熟了啊,说呢是否可以有权限修饰符来进行修饰。首先第一个问题,都有哪些权限修饰符?哎,对这块能说的这都是之前可能有预习过的是吧,诶那全益修饰图化呢,有public。
20:04
哎,有这个叫protected。啊,还有呢,这个叫哎缺缺型。缺省是吧。还有,那叫private。你要说嗯,就较较真儿的话啊,叫福的话呢,其实就算有仨是吧。这个呢,其实就什么也不写,这就算缺省的了啊。啊,虽然有四种权限修饰啊,三个符啊。呃,首先呢,明确有这个权限修符了哈,这个人说这是啥呀,这都。呃,这个呢,咱们简单先说一句哈,就是这个权限修饰符呢,它是来修饰这个,比如能够修饰这个数,修饰我们刚才说这种变量哈,看能修饰哪个了,修饰完以后呢,点是什么呢?就是在被调用的时候呢,就是能够调用那个范围的大小。啊说用于表明是吧。哎,所修饰的。啊,它的这个结构的。啊,结构啊可。调用的范围的大小啊。
21:02
就是什么时候能调,什么时候不能调,你像那个叫public,这就公共的。谁都能掉。对,那大家比如说你把你电脑放在桌子上贴个标签,Public的。那大家就谁都能玩是吧?对,你这要提这个叫private的。对,这就是私有的了是吧,这个你不是谁都能动啊,这是谁的谁才能动是吧,所以这个呢,它表示的就是呃,权限能调呢,这权限的大小就是可调的范围的大小了啊。好,那这个呢,稍微的咱们诶了解一下就行,后续呢,咱们讲封装性讲的就是这个事儿。啊,面向对象三大特征之一是吧,封装性啊好,那这块我们想强调点是什么呢?就是这个属性哈,是可以使用权限。哎,修饰符。哎,进行来修饰的啊。啊,我们这个。呃,局部变量啊。是不能使用。哎,不能使用啊,任何权限修饰符进行修饰的。
22:05
诶属性能用,那属性能用的,言外之意,你看我拿过来哈,这个person这块这仨用这仨是吧,这仨的话呢,你看我前面没写,注意没写其实也是一种权限,就是刚才的那个。学生。就这个权限啊,那你要想加想加你就可以,比如加一下叫private了是吧,哎,这个呢,加上个public。哎,这常看就可以。啊,真能讲啊,哎,但是呢,我们呃说了,这是讲面向对象的时候我们才讲的哈,哎,讲封装性时候才讲,所以暂且的话呢,大家先都不用写,不写的话呢,其实是这种权限啊。哎,所以说这块我写上啊,哎说暂时啊还未讲,诶封装性是吧,哎,所以呢,大家呢先啊这个。怎么着啊?对,大家先不用写任何权限修饰符是吧。
23:01
对,先先记着这个事儿,知道就行啊,其实你不写的话呢,就是它啊。OK啊。呃,那么对于这个局部变量呢,注意你是千万不能写啊,回过来这呢是宫爆鸡丁啊,然后前面呢,来一个叫private,只能自己吃是吧。那不行啊。那这呢就不让你去加,搞错了啊,换句话说呢,就是你加啊没有用,你呢就看它就行了。方法可以加是吧,方法是public呢,我只要能调方法了,我就能调你,我调不了方法,我也调不了你。所以你也没有必要去讲。啊,你的权限呢,就通过这个去体现就完了啊,所以就不要加了。行过了啊。这呢,就我们说这个事儿,这个呢,大家暂且呢,也看成是个难点。哎,先忽略一下这个事儿呢也行啊。好,然后下边这个呢,我们得去重点关注了。诶,这个呢,就是我们提到了这个叫默认值的问题了,哎,那那它的区别点呢,就是属性。
24:06
诶属性呢,他们都有默认值。哎,或者要都有默认初始化值是吧。哎,那么对于我们的局部变量呢。哎,不是不一定了,是聚变量是都没有默认初始化值啊。哎,那你想想,如果它要有默认触发值,意味着。我们如果没有显示负值也能掉。只不过就是默认值而已是吧,那要对于有变量的。没有默认出差值,这就意味着你在使用之前必须要赋值是吧?哎,对的啊,诶,所以这块我写一下,它呢都有默认出化值,那就意味着。啊,意味着啊,嗯,如果没有给属性进行。来显示初始化赋值。
25:02
哎则啊会,呃,相当于呢,就是。呃,则会有是吧,诶默认初始化值。啊,这个呢,就不会报错了啊,而对于我们这儿呢,就意味着。啊,在使用局部变量之前。啊,必须要啊显示的复制。哎,否则。啊,就报错了。哎,他会告诉我说说你没有复制。哎,就这个问题啊好,那这块呢,我们稍微的来过来呢,看一下啊,哎,那么在上边这块,你看咱们这块呢,就声明person。啊,你一个person。哎,这呢,我就创建好这个对象了,创建好对象以后呢,我说呀,这个时候我就直接可以去打印p1.name。哎,这块呢,我们逗号一下,哎,这个p1.a。哎,逗号一下,哎,我们再P一点啊,这个真的真的我不写也没事啊,行,我就打印这俩吧,哎,那么此时呢,这个值和这个值呢,就都有,那就是默认值。
26:04
哎,直播一个是闹,一个是零而已。嗯,OK啊行,那你下边这个就不行啊,比如这个呢,负的,你看我把它那给它删了。那这不就报错了吗?在这是吧,来说你这个变量呢,没有被分配,就是没有给它赋值。哎,就这个道理啊,哎,那这呢是咱们的这个叫U变量,这呢是负了个值,你说你这也没负啊。你看你这哪幅了。这这这怎么理解?行三,行三不也是局部变量吗?哎,对的啊,就是稍微特别一点呢,就是这个行参啊,诶这个呢,是你说这块没付,确实没付,哎,我们也没掉呀。是吧,你调的时候,哎,就是我真正要执行的,要输出的时候呢,你有就行,那就是说呢,对于型材来讲呢,是我们在调用这个方法的时候呢,你再输上就行。对,你就相当于我们在这块啊,我现在呢,就通过P咱们去调这个sleep了,这呢我写了个八,哎,这个八是不是就给这个赋值了。
27:06
哎,这样呢,你再去掉,掉的时候我就有疤了。哎,就他稍微特别点,这个呢是必须要付的。其实你也能想明白啊,什么意思啊,你看啊,你说我掉的时候我再付就完了,你调的时候呢,他没给你机会付啊。你这小括号里边也不能写东西啊。是吧,你这你这个不就得写写上吗。你不写上没机会给你机会去付是吧,所以里边就得写好。啊,其实也不用刻意的去记是吧,其实都很好理解,理解就行啊,所以回过来啊,这块呢,我们稍微的呃,强调一下啊,就是这有个注意。哎,这个注意谁呢?就是这个对于啊,这个方法的这个行参而言是吧,因为它也是局部变量嘛,哎在调用方法时,哎给此行参赋值即可。这个呢,他不是说在你定义方法时候就附上值了的啊。
28:02
好,那么这样的话呢,咱们把整个关于啊叫成列变量,还有局部变量啊,这些不同点呢,就讲完了,大家也没有必要下来呢,诶我说啊有什么区别一下呢,说六个区别你也没有必要啊,只要每一个点大家下来,你一个一个去捋,你发现呢也都很清楚,那就足够了,诶关键的还是看一看你代码会不会写。好,那么属性这个完了以后呢,我们下边来看一看属性啊先生的后边的两个练习题,诶首先我们看第一道题目啊,打开这个1121就可以了,诶这呢有个题目的需求,说声明员工类啊叫employee,说包含的属性呢,有ID name,年龄和薪资,在main方法啊,在这个这个employee test这个测试类当中,我们在main方法里边造两个员工对象,给属性赋值,打印信息。哎,这呢是一个比较基本的问题了,好,我们把这个呢CTRLC一下啊,然后在这个位置啊,我们这块呢,去新建一个,哎,这里边儿涉及到有两个类,一个呢是employed类。
29:00
哎,另外一个呢,是叫employee test这个类,诶这块我们稍微再说一下啊,这个在我们实际开发当中啊。这个一般情况下呢,我们在一个文件当中,呃,就只写一个类啊。诶,你像我们刚才呢,这块创建的其实是一个文件,这个文件里边呢,就只有这个employee这个类,哎,当然了,我们说呢,在一个文件当中,你是可以声明多个类的啊,比如我这块我再写一个所谓的比如叫employee test,这不就相当于一个文件里边,我们就这不就写了两个吗。哎,写两个类,这呢就呈现的是一个文件名了,然后这呢是对应的里边的两个类,那一般我们这样的情况呢,少一些啊,或者极少见,诶咱们呢,你就养成一个习惯,我们需要一个类的时候呢,这块你就新造一个文件就可以了啊这呢我们就称为它叫employee test这样一个类。OK啊,然后的话呢,诶这儿呢,就我们要创建的叫员工类里边呢,有刚才提到的一些信息啊,其实呢,就刚才呢粘过来啊这样的一些属性信息了,然后呢,一般的话呢,我们创建这个类之后呢,测试一般都不会在这个类里边去测了。
30:01
咱们就再新建一个专门用来测试这个类的。啊,其实呢,你说我在这里边生明源属性以后呢,诶,我这里边按说也能写酶方法,只要能有酶方法,我就能作为程序入口,我就可以在这里边测没问题,诶但是一般咱们不这样做,所以呢,从一开始呢,呃,就养成一个良好的习惯了,好这个类呢,就专门来表示员工的啊所以呢,我们里边诶生命的属性呢,咱就写到这儿了。哎,这个呢叫做属性,也是咱们提到类当中的第一类重要的成员。哎,属性的话呢,就是变量了啊,所以呢,我们就直接按照变变量定义的这个格式呢去写就行了,咱们呢讲呃,属性跟局变量对比的时候呢,提到过属性呢,它可以有权限修饰符哈。诶,但是目前的话呢,大家先忽略一下这个事儿就行,咱们后边讲封装性的,就专门来说这个权限休止符的问题的,诶所以暂且的话呢,大家就什么也不用写,诶直接呢,你就诶来声明具体的属性就行啊,直接上来就属于类型。首先呢,是一个编号叫ID哈,诶这个什么类型呢。
31:02
咱们这块呢,就简单的先写成int类型了,实际上呢,在具体公司里边有的呢,它是一个字符串类型的是吧。有的人比如它里边可能会含一些具体的字符了,有的比如带个A啊,带个B啊啊有可能的啊,诶所以这块你可以给它也设成字符串类型,这呢咱就写成一个int了啊。好,然后呢,接下来,哎,String类型的一个是类型的一个age,哎,这个double类型的叫ary。OK啊行,那如果这些属性呢,不是特别熟悉的话呢,建议你在后面呢,写上它的一个中文的解释啊,这个呢,我们叫编号也算是一个良好的习惯啊,这个叫姓名。啊,年龄。对薪资。OK啊好,那么这几个属性呢,我们就声明完了,呃,因为呢,咱们这个题目呢,主要是练属性呢,所以方法这块呢,暂且我们就先不用考虑了,列个完了以后啊,我们在另外的这个测试类里边,咱们写一个main方法。
32:01
哎,没放完了以后呢,其实呢,也就体现了咱们昨天讲过的,诶关于呢,整个面向对象,诶落地的话呢,相对应的我们三个步骤。哎,第一个步骤创建当前这个类,诶创建类其实呢就是呃,主要呢,来设计类中的内部的成员了,属性方法是吧,方法细节咱们还没具体展开讲啊好,然后接下来的话呢,第二步呢,就是创建类的实例。哎,咱们这儿呢,不是说有几个词呢,都是公用的啊。创建类的实例啊,相当于呢叫呃,创建类的对象。诶,或者也称为呢,叫做类的实例化啊,都是一个意思啊,诶那这呢,我们就声明是employee类型的叭,如叫E,右边呢,就我们实打实的去new一个employee。哎,就这样来写的好,那么这个写完以后的话呢,如果此时我去打印这个EPE相关的属性的信息,实际上呢,我们说呢,是不会报错的。
33:01
啊,也是有值的对吧,哎,这就所谓的默认初始化值的问题。哎,所以在这个位置啊,比如说ID啊,我们就直接上来就先给他打印一遍啊,逗号一下。e1.name啊,然后再加号,这个比较长了,你就换行就行啊,然后再逗号一下,这个叫age。哎,逗号一下,然后salary。哎,Salary是吧,啊,这个ID我们给它加上啊,诶你看我刚才我要忘了加了啊,你说打印眼皮它能输出东西不。也能是吧,哎,那这个输出的是啥呀。对,这个呢,就应该是低脂值了。那咱们昨天呢,也画了一个内存结构图了啊,其实也知道,呃,像这个,诶,我说一个总结性的话啊,像这种引用数据类型的变量。引用数据类型的存的其实都是。地址值。哎,存的都是底质质啊好,那么它指向了什么呢?指向的就是你对应的那个结构啊,比如你要数组,那就是数组实体啊,你要是一个对象,那就是你对象实体。
34:07
所以呢,它存就是哎,指向那个实体的那个首地址值。OK啊。只不过呢,我们平时一说呢,就说地址啊,其实它在地值前边呢,它是有一个艾特服在艾特前面呢,是不是还有一个,你这个叫变量也好,叫对象也好,它的所属的类型是吧。对的啊。哎,这是我们要写全的话呢,就是这样来说了。好,那么这呢,就我们打印了它相关的这个属性的信息了,来我们run一下。好,这就出来了啊呃,这个呢,就是它对应的类型,呃这个类型的话呢,你注意你看它写的特别长啊,它呢把我们这个类呢,所在的这个,呃,其实叫包了是吧?诶都给我们显示出来了,就这个它是要显示的啊,你说整这整这么长,直接写个in employ e不完了吗?诶因为呢,我们其实在不同的包下。大家其实应该也发现过啊,不同的包下呢,你是可以定义同名的类的是吧。就是这个包下呢,可以有一个叫employee,这个也有,那这块他要写明你到底是哪一个包下的。
35:05
所以呢,它会写全的啊,诶,然后对应的这个地址,诶这个呢就写出来了,好下边这块呢,我们也发现了,在我们没有显示赋值的时候呢,它是有默认值的,哎,咱们昨天已经说到过这个默认值的一个情况了。没问题,好,那么我们在这个。诶,打印这个值之前呢,给他呢,附上一些相关的值,比如ID啊,1001啊。第2NAME啊,比如叫哎Tom。那第2A啊,这个24岁啊。第2SALARY啊,来一个。比如说7800。哎,这呢,相当于有一个自动力行提升的问题了。嗯,OK啊好,然后呢,我们这时候再去转。那此时呢,打印的信息呢,就是我们刚才显示来赋值的这样的几个数据了。啊,没有问题啊行,这个呢,是我们说的关于创建这个类的一个对象的一个情况啊,说呢,你再造个对象啊,再造个你就再体会一下就行啊,相当于我们在这个位置啊。
36:03
这呢叫哎创建哎employee的第二个对象。Employed,第二个对象啊,好,那这时候你就再去创建一个就行了。这这块呢,大家一定要明确啊,我们提到了说再创建一个对象啊,你首先应该清楚了,就是在堆空间当中有一个对象了,再创建一个,就意味着你得再开辟一块内存空间。对,只要呢,体现出再开辟一块空间,这块就得是用new。New呢,你可以理解成就是开辟空间啊,或者叫分配空间这样的一个意思啊,那也就是说呢,我们这块明确说了,让你再创建一个了,你是肯定不能这样写的。啊,E是吧。这是不对的是吧。对这个呢,你顶多说呢,我们说叫又新创建了一个employee类型的一个变量。但是那个变量的值呢,还是原来的这个对象实体。
37:00
哎,并没有新造一个对象。哎,这个大家一定要小心一点啊,所以这个写法呢,它是错误的写法啊。那咱们昨天呢,其实也说这样的问题了啊,CTRLY删除,诶这个呢,才是真正的又造了一个对象,好,那又造了对象,我们说呢,多个对象之间各自呢,拥有一套当前类中的属性。啊,就是这些这样这些属性呢,我们以后呢,会给它再起一个名。哎,属性呢,后边我们还会给大家属性再分一下类啊,哎,那么咱们目前写的这些属性啊。哎,属性咱们说也叫做成因变量嘛。是吧,哎,以后的话呢,我们把这样特征的这种成员变量啊,咱们又起了个名叫做实例变量。实力不就是对象的意思吗?实例变量呢,就是你这些变量啊,都跟具体的每一个对象相关的。换句话说呢,就是每个对象有一份。
38:01
事实情况也确实如此是吧,诶每个对象有一份儿,所以呢,我们在这块啊,我们每创建一个对象,你发现呢,他们就各自拥有一套这个属性。我们就把它称为呢,叫做实力变量。哎,大家现在就那么一听啊。那好像说呢,除了实例变量还有别的成员变量一样是吧。呃,有些成员变量啊。每个对象呢,你说有吧,它也能掉,但是呢,大家会共用。哎,再说一遍啊,就是这呢,只要是写在我们这个类里边的这些变量,都叫做成因变量了。全变量以后呢,我们会讲一个关键字叫做static。哎,不用死呆,这个修饰的呢,就叫做实力变量,也就是每个对象有一份,就是咱们现在讲的这些,这都叫实力变量了,那以后呢,如果说有一个变量呢,它加上了一个staic了。啊,就是稍微你看一眼就行啊,比如说sta,我有个string类型的,比如叫个infer,这个info信息呢,我就叫员工。
39:03
哎,就它是吧,哎,那么这个变量的话呢,哎,就是你说对象能调吗?能调。但是的话呢,不是每一个对象有一份儿了,而是所有的对象呢,共用着一个。哎,共用这一个,诶因为呢,大家不都是员工嘛,诶所以我就用这个变量来刻画员工,所以大家呢,这个值都是一样的,哎,就用这一份就行了,这个咱们以后呢再讲,哎暂时的话呢,大家知道啊,没有死在这个这一说,那么这些变量就是每个对象一份。哎,进而啊,咱们下边呢,针对于这个,比如EP2啊,我们这个上来,如果你就去输出它的这个值的话。啊,这个我们改成EP2啊。诶,上来呢,我就输入它的值,呃,你会发现呢,跟上边的P1呢,显然是不一样的。对,这个呢,就是因为你是你的,我是我的,你赋过值你就有,我没赋过值,那我就默认职,哎,所以大家各自有一份哎。
40:01
就可以了,行,这个题呢,我们想说的就在这儿了啊呃,至于说大家你想显示复制,你就在这复就完了。OK,这就过了。行,这块应该没啥问题是吧。嗯,好,那接着我们来看下边这道题啊,这道题是这样的,这道题的话呢,其实稍微就有那么一点难度了,这个咱们写完之后呢,也可以简单的给大家再画一画它的这个内存结构图啊。好,那么他呢,其实有点像在上一道题的基础之上来处理的哈,说呢,声明一个叫my date的类型,有属性,叫年月日,然后呢,声明一个employee类型,有编号、姓名、年龄、薪资和生日,哎,相当于我们多了一个属性。OK,然后下边就是具体的一个测试了啊。好,那这块我们首先来处理一下这个my date的问题啊,CTRLC,诶在EC2下边新建一个类啊,我们就叫my date。来教他啊。好,关于它的描述呢,我们就写到这了,这呢就提到了说有三个属性,哎,我们就都编译成in的类型了,啊,这个叫year。
41:01
Month。是吧?这个你上面写一个这个注释信息也可以。年。哎,月。哎,日。这个因为我们现在其实讲这个属性的啊,方法这块呢,我们暂时呢就都不整了,就啊行,就这三个属性完事,接下来呃,声明一个EE类型,那有这样的一些属性信息。新建一个Java class啊,Employee。在这啊。好张过来,诶这呢提到的这个属性啊,跟我们刚才前面这几个是一样的啊,诶思政类型的name。啊,In的类型的age。这个Apple型的一个salary。好,然后呢,再接着一个叫my date类型的叫birthday。哎,这个呢叫生日啊,诶每个员工呢,都有这个生日,我们就用my date这个类型的变量啊来进行刻画。哎,这个是薪资。
42:01
啊,这个呢叫年龄。哎,姓名。编号是吧,好这呢就可以了啊。呃,这呢是我们对应的这五个属性,哎,那么首先呢,我们关于这个位置啊,其实要给大家呢去讲一讲啊,有的同学呢,可能就比较迷糊了啊,所以这怎么还能在这个类里边声明了一个属性,诶,怎么又是另外一个类的那个类型呢?这块大家看看,这能接受吗?能接受啊。啊,那刚开始学这个编程的同学呢,就是出现,哎,就是我们定义了两个类,说白了啊,这两个类之间呢,它有相应的这种关系了,这种关系呢,就是其中一个类啊,它生命的一个变量作为另外一个类的属性出现的。这个大家要知道是没问题的啊。你看咱们去找我们这个知识点的这个根源,你看啊,哎,首先呢,我们说这个类里边可以声明变量了。哎,变量的话呢,它就有类型。类型的话呢,我们说可以是任何类型。
43:03
啊,基本数据类型,隐形数据类型都可以是吧,那既然呢,能够是隐形数据类型。那就可以是去,呃,可以是这个类类型的。那类类型,比如说。哎,存真不就是类类型的吗。哎,你写个类类,我觉得这不挺好的吗?挺正常的是吧?哎,那行了,此缀呢,只不过是系统给我们提供现成的一个类。那我们可以在这声明,那my date呢?MY也是个类啊,只不过是我们自己定义的而已,是吧?诶,所以这没问题。哎,只要你是一个类型。啊,是一个引用类型的,我们都可以声明成这个变量了,那这个变量如果放在类里边,那就是成员变量。哎,咱们后边还会见到什么呀?哎,见到在一个类里边,我声明这个成现变量还可以是个数组呢。是吧,你比如说我们这个叫员工,员工呢,假设他就有这个。账户吧。啊,这个公司给大家发工资是吧,还有账户,因为账户说,诶这个员工有好几个账户。
44:02
好几个账户,那怎么办?是不是就用一个数组来装啊?对,那样数组假设啊,咱们这个账户呢,有个类叫account了,那他有好几个账户,那我就生命成了数组,我就要accounts。这个你说可以吧。可以的。可以的啊,你看你这个类里边有属性,属性的类型可以是任何类型,那我是数组。可以啊。哎,数组直播这个数组的类型呢,你看哟,又是个赢类型的。那你想我看了你看不懂,你换成钝钝性的数组能看懂吧。String要能看到了,那把string换成一个我们自定义的一个类,那不也一样吗?诶都可以的,只不过呢,咱们之前没见过而已是吧,没见过不等于不可以,诶从理论上分析呢,就是任何一个诶引用类型的啊,都可以作为我们这个类中的这个属性的类型。语法上都是OK的啊,所以这块呢,大家理性上接受一下它啊。
45:02
行这个呢,我们就写完了啊,然后呢,下边呢,就是具体的这个测试问题,诶回过来啊,诶针对于我们这个员工的是吧,诶他的一个测试。哎,就在这儿了啊好,没方法进来。哎,首先我们说哎创建。哎,这个employee它的一个实力。哎,那这呢,我们就employee p啊,你一个employee。哎,这样我们就造好这个对象了。诶大家始终呢去强调一下,咱们前边啊讲过的,在这个o op里边,这是一个重点内容,就是这三步。只要大家写Java的啊,面向对象的这个代码都是这样的套路。啊,只要大家写Java代码都是这个套路啊,第一步啊创建类啊,第二步造类的对象,第三步啊,通过这个对象呢,调属性调方法。诶,只不过呢,就第一步呢,呃,有的类呢,是我们自己造的,像这里边employee data,有的类呢,不用,比如说像这里边这个词论啊,这都给你定义好了,直接你拿过来用就行了啊,然后第二步造对象呢,诶造对象以后我们还会讲有好多种方式啊,只不过呢,最常见的是这种方式。
46:10
所以我们就先把这种方式啊,先熟悉啊,然后呢,呃,通过对象调属性调方法这种事儿呢,是我们特别常见的面向对象编程,这个对象呢,就是你得拿着这个对象,接着呢你去做这样的功能。啊,就是前期呢,把这个事儿呢都做好了,然后后边呢,面向对象编程,就是拿着对象去调功能,这样来体现啊,你完成相关功能的这样的一个细节了啊。好,这块我们拉回来,诶这个对象已经创建好了,下面呢,给它的属性呢,去赋值点ID啊1001。哎,P一点这个叫name等于是吧,就是杰克啊。E一点啊,来一个age 24岁点啊,还有一个呢叫salary。哎,这个比如说哎。八千九啊好,诶下边这块呢,注意一下啊,这个延一点,哎,它有一个叫birthday。
47:01
这个你说我们怎么复制。对,你看一下啊,这个的类型是它。它不像我们说的基本数据类型,这ID啊,In的类型的,直接就付付一个数就行了,只要是这种引用数据类型的哈。其实呢,都应该是,尤其还是类类型的,都应该是通过new的方式来造对象是吧。诶,只不过这块呢,我说一下啊,对于这个死追来讲呢,稍微的特别一些。也就他特别啊。呃,其实的话呢,你想想你这个,呃内姆按说也是一个类类型是吧,类类型,那那不就是个对象吗。那只要是对象,那是不是应该是new啊,哎,那我们去new一下,那new一下呢,这个string呢,这块其实它还支持。啊,支持里边我们放一个这个string了,也就是这块呢,你要这样写。大家目前呢,把这两个写法呢,你先暂时理解成是一个事儿。啊,一个事儿就是瑞呢,就他特别哈,他是可以这样写的,别的都不行啊,诶所以这个呢,我暂时我就把这个给先注释一下吧。
48:07
哎,我就先放到这儿了啊。行,那么对于我们其他的这个引用类型啊,比如像来讲,他这就是个类类型,那你就得是new啊,那我们就得去new了。哎,扭一下,哎,那你类型是my date了,那就拗一个my date呗。哎,就这样来写。哎,注意就这样来写啊,那也有的同学呢,就觉得说,哎,我这个写法,我能不能改成这个写法呢。这样写的啊,诶我呢,先声明一个MY,我叫一个,比如叫。BIRTHDAY1吧。然后呢,我们去了一个my data。哎,是吧,哎,然后呢,我再通过这个E点。呃,然后呢,拿这个birthday,诶这个我叫BIRTHDAY1,这个我换个名吧,要不这个不太好理解了,我叫my date1啊然后呢,我把这个E的这个属性呢,就拿这个变量呢,做了一个赋值。
49:00
这样写法可以不?跟这一行对比一下是吧。诶是可以的,对可以的啊,只不过呢,这个呢,我们是拟完以后呢,把这个地址直接就付给了你这个属性了,是吧?而这个呢,就是我们先诶这个造完这个对象之后呢,我先保存一下这个地址放到一个变量里,然后把这个变量的这个地址再给你,说白了,你不是还是指向它吗。哎,只不过呢,这个位置呢,我没有显示的,再去定一个变量名啊而已是吧,哎,这个呢,你也可以说哎。另一种写法。哎,这个我们这样来写的啊,都可以啊,没问题。好,那么这样的话呢,我们就把这几个属性呢,就附上值了,哎,但是你稍微小心一点啊,这个位置我们付完以后呢,麦地里边还有仨属性呢,这仨属性其实是还没赋值呢。哎,那回过来我们赋一下值吧。哎,负值的话呢,你看我就可以这样付了哈,E1.birthday。这呢是个my date类型。第二。页一下是吧,哎,比如说这个,嗯,这个我我就不精准的去算了啊,说再推算一下是哪一年的了,我就比如说九八年的啊。
50:06
Ver month。啊,比如说这个二月的啊。嗯,这个day。这个二十二十二十九别了28吧。行,这个呢,就是诶年月日是吧,哎,这就可以了啊。行,那这样的话呢,就是你现在的这个属性呢,哎,该有值的就都有值的,最后呢,比如我们打印一下啊。哎,员工信息啊。哎,员工信息啊,行,诶打印啊print。行,那前面我们打印其他这几个属性的时候呢,这块大家问题都不大啊EP一点我们调个ID。Name。你看这个呢,你可以直接就换一个行啊。然后a name啊逗号一下,然后呢,这个叫age。
51:00
EP11点啊,它的一个A。哎,逗号一下,然后还有一个呢,叫呃,Salary是吧。Salary,好,然后呢,接着我们再逗号一下。然后还有这个再换一下,好在这啊。还有呢,这个叫birthday。诶,Birthday是吧,诶birthday一块呢,你不行,你就这么着吧,我们整一个这个中号是吧,然后在这里边呢,写上年某年某月某日是吧。嗯,这咋写啊。某年某月某日,然后最后呢,你在整个这个中国号把它封起来。叫大钱。哎,E先找到他的birthday是吧,这样诶我这样写行不。对,这样的话,你看我们打印。诶,这个你注意这个,诶前面这块你看都没问题哈,到波这块呢,因为你这是一个引用类型是吧,诶不就是我们刚才说呢,你这个实际扭出来的这个结构的那个地址给了他了,所以他存的是个地址了哈,所以你打出来就成这样了。
52:05
嗯,这这肯定不靠谱是吧,所以我们希望呢,展现出来年月日了,那你就是得通过他呢,再去找这个一日是吧。哎,然后这块诶再整一个,比如说年是吧。哎,这个年。嗯,这个呢,E一点birthday点啊掉了一个month,这个又又再换一行吧。这个我们叫做月啊,这个忘了加号了。这个你看拼起来有点费劲啊,这就拼字无串的啊。这个整哪了,懵了是吧?到这了是吧,这个月,然后呢,在e.birthday.day是吧,然后在日。呃,月啊,这又少一个,嗯。得小心点,哎,日日完了以后呢,就完事了啊,那这块我们把这画就直接放到这儿了。后边这个就不用了。嗯。
53:00
啊,哪少这这少一个啊这个对。对,那这个可得小心一点啊。像这些事儿的话呢,以后我们都可以。重写吐人方法啊,帮我们呢去优化去改这个事儿啊,要不自己写起来还是挺累的啊好,这个完了以后呢,来我们乱一下。嗯,看一下啊,说前面没问题,然后birthday等于诶年月日哎挺好是吧。不白拼呢,在这儿。嗯。行这块呢,大家OK吧。可以啊行,那么下来呢,把这道题呢写一写,诶这呢,我简单的来画一画啊,咱们这个练习的这个内存的结构图啊,咱就画一个简图,我就在就在这块来画了啊。诶咱们就这么着,然后核心的代码的话呢,咱们就拿诶这几行来说。嗯,我就这样一下啊,盯一下。好,这个呢,我就往这儿放了啊,咱们就在这画一个稍微的一个简图就可以了,好那么假设没方法一进来我们就是这样几行代码,那对应的这就是一个占空间,这呢是我们这个堆空间。
54:04
好,没问题,然后may方法的话呢,我们提到过方法的话呢,都是以一个战争的方式把它压入到这个占空间的,所以呢,May方法对应的这就是may的这样的一个战争。哎,战争进来以后,在方法中声明的变量都叫做局部变量,局部变量都存在于战争当中。所以呢,一上来我们有一个EPE啊,这个EPE我就简写了啊,我就要E1了。啊,一一呢就放这儿了,好,这呢是我们的局部变量都是在站立,然后new出来的结构呢,都在堆里啊,所以new的一个lo就是放在这了。然后呢,它会有一个首地址值,把这个地值给了我们的这个一一啊,一一呢就拿到这个地址了,它呢就通过地址指向了堆空间,你new的这个employee。然后接着啊,然后呢,我们说呢,在类中啊,或者我们创建的对象当中,都会有当前类的一套属性的这个副本了。啊,那就意味着我们这个成员面料啊,就存放在堆空间中。
55:03
记住啊,只要是成圆面料。就在堆里边。只要是局变量就在站里边啊,这个原则呢,是永远不变的,以后你画内存图,你就遵循这样的规则啊。好,然后呢,我们在这个对空间里边呢,New employee呢,有几个属性啊,分别呢,叫ID。Name简写了啊。这个salary。还有一个叫birthday。哎,五个属性好了还没完事啊,这一行代码呢,执行完的话呢,我们去调这几个属性呢,也都有值,他们呢只不过是默认值而已啊,所以ID呢,这是零。这儿呢?No是吧,然后age。Salary。0.0是吧。那引用类型的嘛。好打印的话呢,就是这样一个效果,那么接下来的话呢,我们通过对象调属性的方式呢,显示来赋值,所以把零改成1001。
56:02
把这个闹呢改成杰克是吧?哎,注意啊,杰克呢,我是暂时写到这儿了。我也说过好几遍了,其实真实的这个杰克呢,他不在这儿啊。因为我刚才还说过一句话。我说呢,凡是引用数据类型的变量,这个变量存的呢。都是地址值。啊,那所以说我我要把集合放这儿,你也能想到是不是不太对啊。对的啊,当然这个字符串这个事儿呢,它比较比较比较复杂啊,所以咱们呃,先就先放这儿了啊,一两句话呢,说的不是那么透彻了。啊,它其实呢,呃,像我们这种写法呢,就把它直接放到常量池里了,那常量池在哪呢?呃,常量池呢,说来话长哈,JDK6的时候呢,是在方法区的啊,JDK7的时候呢,就放到堆空间里了,然后JD8级以后呢,又都在堆空间里边。然后这块呢,相当于是个地址指向了你常量池里边的那个杰克那个数据了。啊,所以这块呢,就就就比较复杂一点,所以咱们就先就当没这回事儿啊,我就先放这儿了,以后我们讲常类的时候呢,专门来讲它,你要后边这个new的方式,那又又不一样了。
57:10
所以先不整这么些啊,好就先放这儿,然后下边A呢,这个把这一删24。Salary salary呢,把这一删8900。好,下边这块,哎,这是咱们说的这个中头戏了,下边这块的话呢,你看我是这样处理的啊,首先我是new了一个my date,只要是new在堆空间中就开辟空间了。这呢就我们用的这个my date,哎,它呢会有一个手机日值。然后还没完事啊,这里边会有属性啊,叫year,呃,Mass和这个D,呃,因为呢,人家里边有长页变量,常页变量都是有默认值的,所以000。诶这个值好,你把这个地址你给谁了呢?给到我们EP的worth这个属性,诶这个属性在这等着呢,你把这个地址你给我,诶那你这个地址呢,就放到这儿了,把这个一删,然后呢,这不是通过这个指针就指过来了。那就这样。哎,目前的这个内存空间就长这样了啊,就是这嗯,这一行代码执行完以后啊。
58:04
好到这块看有问题没有。没有好,接下来接下来的话呢,我们是要找这个EMA和D,我想给这仨变量赋值,诶这仨变量赋值我们现在有的呢,就是这个P啊。所以呢,我们通过E先去找到它的birthday,所以E1.birthday就找到它了,通过它呢,我们再去点这个year,哎,这不就找到这儿了吗。哎,这就是1998。哎,然后把这一扇二月的啊,这个28,哎,这不就附上值了。所以呢,整个我们这个空间当中啊,我们现在能够使用的就只有这个EPE这个变量。只有通过这个变量,我去找这些属性来去找到这个birthday,然后再通过birthday呢,再去找这个year month和这个day,所以下边你看我们调用的时候呢,找这个年月日的时候呢,都得是从这个EP一出发来调的。哎,注意啊,你看刚才我在写这一行代码时候呢,我是不是有个注释是吧?哎,我说大家还可以用另外一种方式,另一种方式你看还有印象不。
59:00
哎,我是呢,先new了一个MY,是不是给它赋给一个MY类型的一个变量了是吧?哎,我将MY1了,诶那个是什么方式,那我简单说一下啊,哎,那个方式这样的,就是先忽略掉这个事儿,我们new了一个MY。哎,你用了MY以后呢,然后我把它呃付给一个my date类型的变量了。只要你是新声明那个变量,那就是一个局变量,局部变量是不是就应该在战争里?哎,那我们这个我加my date1了哈。哎,我就在这儿呢,是不是,诶把这个地址呢附过来就给了他了,他呢,这不就指向这个吗?然后这里边有这个页mass还是个D是吧?哎,这个值能默认的也是000。没问题啊,然后接着的话呢,咱们是把这个变量是不是又付给了咱们叫E1,它的这个拿这个my date1是不是这样的值是吧,相当于就把这个地址呢,你再附到这儿。把这个地址附到这儿,那杨一呢,就我们的这儿呢,是不是就也指向了你这个数据了是吧。呃,也指向这儿了,呃,然后接着的话呢,我们,呃下边这个操作呢,你就拿这个E再去找这个,再去找这个去赋值,诶跟我们刚才这个过程呢是一样的。
60:08
但是这块多了一个点呢,就是你多了一个变量是吧。其实呢,我们你说我要是找想去找这个year mass和day,我能除了啊从E出发找birthday birthday再去找他之外呢,是不是通过这个变量也能找到他仨。哎,对的是可以的啊,哎,但是建议大家呢,在题目当中呢,以后呢,就别通过他去找了。啊,因为啥呢,因为呢,诶我们这个呃叫year must day,这叫一个生日呢,这个生日呢,就是我们这个变量这个对象呢,员工这个对象的,然后呢,你直接调呢,总感觉好像不太合适。就好比是什么呢?呃,比如这呢是一张银行卡,呃银行呢帮你造了一张卡,他把这张卡呢,你你呢就作为一个客户,你有一个属性就是银行卡,他呢把造好的这张卡的地址呢给你了,你不就可以直接访问吗。那以后的话都是你拿着你的卡,你去存钱取钱。那一般的银行就不再拿着这张卡,他去给你后台呢,去加钱减钱了。
61:04
是吧,哎,这就不太合适了,哎,就是简单这样理解一下就行,OK啊好,这呢就我们画的这个内存的结构图了,大家呢,再去熟悉一下整个的原则就是成业面料。啊,随着类的创建而产生,放在堆里边,局部变量永远放在占空间,对这个大原则把握以后呢,大家再画那个图,哎,基本上就没啥大问题,就是多操作就OK了。好,关于属性我们就说到这儿。
我来说两句