00:00
好,那么这两个概念呢,我们明确出来以后呢,接下来我们看这个继续啊,在这个编程层面呢,我们怎么去体现啊,怎么去设计咱们现在的这个程序了,好,那这块呢,我们就,哎接着来看我们下边这个内容了。诶,下边这块呢,我们就提到说这个类的这个成员的问题了哈,诶这里边有两段话啊,说第一句说面向对象的程序设计的重点呢,其实就是类的设计啊,像我们前面的string也好,Scanner也好,Mass也好,A race也好,都是现成的这些类,那有了这些类呢,我们就直接呢可以去完成相应的一些功能了,所以我们啊,要想完成面向对象上面我们也提了一些需求是吧?啊,比如说这个航班目录啊,你机票啊是吧,这个都是一些类啊,然后我们得先去设计这个类,哎,设计类呢,其实就是设计类的内部的成员了。哎,那我们下边就要关注啊,到底都有哪些成员呢?呃,下边我们又举了个啊类似的例子,说呢,现实世界当中的生物体,大到鲸鱼,小到蚂蚁是吧,都是由具体的细胞构成的啊,细胞里边呢,有啊,细胞核,细胞质。啊,还有一些细胞器是吧,线粒体呀,啊,细胞壁是吧,等等这样一些结构,那么从我们这个Java代码这个世界上来看呢,你这个项目呢,可能代码量很小,只有几行代码啊,或者只有几个类啊,你也可能说呢,诶代码量相相当庞大,几十万行啊,甚至说呢,这个上百万行这个代码,那不管你是代码量小还是代码量大,我们整体上来看,都是由一个一个的类构成的。
01:22
啊,那么接下来就要问说这个类里边都有哪些东西。哎,类里边的东西啊,其实比较多,我们先讲两类最常见的啊,一类呢叫做属性啊,一类呢叫做行为。啊,那么首先来看属性是什么属性呢?是该类事物的状态信息。哎,对应的就是类中的这个叫成因变量了。相当于我们把这个变量呢,就可以定义在这个类里边啊,然后呢,诶这个行为呢,就是该类事物呢,要做什么样的操作,或者说呢,基于事物的状态呢,能做什么样的操作,这个呢,我们对应的叫类中的叫成员方法。啊,平时呢,我们在叫的时候呢,如果说哎类中的属性说的就是它也称作呢,叫成因变量。
02:02
啊,那用英文呢,它叫做field。采取它啊,然后这个行为呢,就是说你这个类呢,它到底都有什么样的功能啊,哎,这个行为呢,我们就称为呢,叫成员方法啊,也可以直接就叫做方法了。对应的有些语言当中习惯性的叫函数。有的可能还叫过程。啊,存储过程过程是吧,诶然后呢,这个英文呢,叫做method OK啊诶那如果我们要用一份简历来去这个做一个类比的话哈,这个简历里边呢,诶我们以后找工作也会写简历,诶像左边这块呢,你的基本的一些情况啊,政治面貌啊,居住在哪儿,学历啊,包括这个电话是吧,性别等等,像这儿呢,都理解成是叫属性。啊,那么右边这块呢,说你的教育背景,你在哪个实践段,这个在哪个学校读书读读的是什么专业,你的社会实践是什么,诶在哪个公司工作过,诶这个呢,都可以看到,是你的这个功能和行为,我们就可以用方法去。客房。
03:00
哎,所以这样的话呢,我们就把这个类呢,先简单的理解成就有两部分构成。啊,就是我们下边提到这个事儿啊,体会一下设计类其实就是哎,设计类的成员。你想想我们要设计个类的话呢,其实非常简单啊,比如说我们这直接来一个class,哎,比如我写一个人类啊,直接一个person。这个类这这就完事了,类就声明好了,但关键你说这个类能干什么呀,实际不就是设计它内部的东西吗?啊,那这里边就叫内部呢,有两个常见的结构啊,第一个呢,我们称为它叫属性是吧,哎,成员之一。哎,这个我们称为呢,叫做属性啊,也称为呢,叫做成员。变量。啊也可以成为呢,就是叫。Field是吧,哎,这个field呢,其实诶翻译过来的时候呢,很多书里边把它又翻译成叫做这个字段啊,有的人又翻译成叫玉。哎,这个呢,如果你要看一些外文翻译过来书的时候呢,他如果翻译成这两个词了啊,你也知道呢,说的就是属性,或者说呢,叫成员变量啊。
04:03
好,这呢是我们这个成员之一,然后呢成员之二。哎,这个呢,就是我们这个类里边呢,都具备哪些功能呢?这个所谓的功能呢,我们称为呢叫方法了,哎,一般呢,咱们叫的时候呢,这个成语二字呢,针对于方法这块呢,就给大家省略了啊哎,或者也称为呢叫做函数。这个是借助于其他的一些语言啊,像C语言里边我们都叫函数了。哎,像这个circlecol里边呢,我们称为呢叫过程,当然这个呢用的比较少,所以我就不这样去写了啊,哎,我们也可以呢,用英文来表示就是method。哎,就它啊,OK行这呢,就是我们说这个类里边的这样两个结构,哎,那么接下来啊,要的事儿,我们就得是看看这个属性也好啊,方法也好,该如何呢,去声明了,哎,下边咱们就举一个具体的例子啊,哎,这个例子这块呢,我把这个具体的这个类呢,哎,首先已经写到这儿了,诶我们定一个手机。啊,手机注意这是个类,这个类呢,就是我们刚才说这个抽象概念上的这样的一个结构啊好,那只要是手机的话呢,我说它就会具备相关的这个属性。
05:05
啊,以及呢,有相关的一些功能,这个功能呢,咱们叫做方法了。哎,叫做方法好,那咱们先整体上呢感受一下啊,这个属性呢,其实就是变量啊。哎,这个变量的话呢,它是定义在我们这个类里边的啊,以前咱们写的话呢,是不是都写在内方法里是吧。现在呢,我们是在方法的外面啊,哎,比如说这个手机啊,具备什么属性呢。价格是吧,啊,大型的一个price。品牌是吧,你得有个名啊,这个string类型的啊,这个品牌呢,好像叫brown是吧,对大家不好,不熟悉,那咱就叫name吧。哎,这个两句叫做诶品牌。啊,这个呢,就到价格是吧。啊,型号啊等等,还有好多,咱就简单一点,我就列俩了。在这呢,就是它的属性。好方法就是你具备的功能啊。嗯。对,最起码呢,手机得能打电话吧,是吧先,哎能够打电话啊叫扣,哎里边呢,我就简单写一句话啊,说手机。
06:08
手机。哎,能够,哎叫拨打电话。虽然说现在大家拿着手机好像已经很少直接打电话了,是吧。诶功能呢,拓展的比较强大了啊呃,一个打电话啊,然后另外的话呢,在。这呢相当于在这个咱们现在要5G了啊,原来1G的场景下就打电话是吧,诶2G的场景下呢,可以发这个短信息了哈。哎,Avoid,咱们叫send一个message吧。哎,这块你也可以写,你要发送的这个信息是什么。哎,我们叫哎发送信息是吧,然后这个信息呢,就是你,诶参数里边写的这个叫message。那就他啊。嗯,还可以干什么?拍照听音乐玩游戏啊对,现在这手机呢,基本上把很多这个原来周边的这些电子设备全给干死了是吧。
07:00
啊,原来这个索尼出的是吧,很经典的一代一代的啊,那现在基本上大家除非是专业的玩家,否则呢,就很少玩了是吧,MP3MP4。还有原来那个想火的这个电子书。现在也有市场,但是很小众了。诶,也给整死了是吧。对Kindle是吧,对都退出中国市场了都哈,对死了很多这个周边啊,因为手机呢,都直接一统天下是吧。来一个叫play game吧。哎,玩游戏啊。哎,手机啊可以啊玩呃游戏是吧,好这呢我就简单点啊,就写了这样的三个方法,诶这个呢叫属性。哎,来刻画它的一些具体的特征的啊,然后这个方法就是它具备的一些功能。啊,具体细节呢,咱们先不用管,你说这个怎么声明啊,细节先不管啊好,那么这样的话呢,我说这个类啊,我就设计好了。我们设计好这个类,你的目的是为了只是为得到这个类吗?
08:00
肯定不是,是吧,就跟我们说想造个手机,我咔咔一顿画,把这个图纸画出来了,你的目的只是为画个图纸吗?肯定不是。对,你得需要呢,拿着具体的一个手机,我要打电话,我要玩游戏呢,你现在告诉我是虚的是吧,说你看这有一个手机是吧,还能打电话,那都是空想啊,这个跟投资家说行。消费者必须要看到东西是吧,诶这个东西呢,我们叫做对象,所以呢,下一步是不是要造对象。哎,造对象的话呢,哎,咱就不在这个类里边,我去造了啊。如果你非要在这里边也行,就是把main方法就写在这儿了,在一般呢,咱们不会这样设计,哎,我呢就把这个main方法我专门放在另外的一个类叫phone test,在这个类里边呢,我们体现这个。哎,测试,所以这个风太呢,我们看到是phone这个类的一个测试类啊。诶,它是我们这个诶缝类的一个测试类啊,以后我们写代码的时候呢,这个呢,就是一个实体的一个类了,这个呢就是它的一个测试啊好在这里边写背方法,我要干什么呢?我要创建对象。
09:05
创建我们这个呃,Phone的对象,这个对象怎么创建啊,这块我们先复习一下,前面我们其实已经创建过某些类的对象了。热干是吧。哎,这个位置我们就是system。叫in,哎,它呢,就属于我们前面已经接触过的这样一个场景啊,以它为代表呢,其实就涉及到叫变量的一个定义格式了哈,哎,不还是跟前面讲变量的时候说的一样吗?哎,数据类型。变量名,哎,右边呢,就是变量的一个值。整个的定义变量就是这样一个格式,所以呢,这块我们想定义的这个变量是一个凤类型的。哎,那我就写个封了。然后那地名呢,我比如说就叫P吧。叫P了啊行,然后右边这块呢,就我们要给他造一个对象了。哎,对于对象来讲呢,我们典型的创建方式就是你用。
10:02
哎,我们讲数组也是new哈,哎,这里也是new new一个什么new,你这个呢是scanner new也是scanner,这里呢也是new的一个风。哎,这个小块里边呢,是什么也不放的。哎,这个它放了,这是它是特殊的一个结构哈,哎以后呢,我们到时候再说这边这个事儿,哎,那这呢,我们就相当于把这个对象呢,就创建出来了。哎,把这个我们站到这儿。哎,创建了一个具体的手机在内存当中啊,这时候也会开辟相应的空间的。好,这个手机造出来了,哎,你主要的目的是不是要使用这个手机啊?哎,那么这个使用呢,就体现为我们通过这个对象呢来调用,哎,我们刚才设计这个类收的,呃,一些属性和方法。哎,所以这呢,我们理解成啊,就是通过哎缝的对象。诶,通过phone的这个对象啊,来调用其内部声明的属性或方法。哎,那么具体这个格式呢。
11:02
哎,这个格式呢,在我们Java里边呢,都是用这种点的方式的啊,所以呢,我们就可以呢,叫对象点属性。哎,或者。哎,这个对象点,哎方法。诶通过这样的方式呢,咱们对内部的属性和方法进行调用,比如说诶我们这个手机叫P,诶你这个手机什么名啊。起个名是吧,哎,比如说这个华为的。啊,新出的这个mate。50是吧。诶,这个呢,就是他的这个手机的名了啊P一点,嗯,价格是多少钱呀。嗯,对。咱就6999吧。好像卖的其实不太便宜哈。好,这个呢,就是它的我们对于属性的调用,那这个调用的话呢,体现为负值,那你也可以说这块,诶我赋完值值是多少啊,你也可以在这打印一下看一看,这就是调用它的这个值了啊,比如我这个name等于,哎你就直接呢P一点内就行是吧,哎逗号一下说这个price等于,哎你再调一下这个1.price看是不是就可以。
12:04
没问题是吧。这个能理解吧。这就是调属性的啊好,那下边的话呢,你是不是也可以调方法。哎,掉发之前咱们先跑一下吧,哎,我run一下。你看这不就出来了吗?哎,这个呢,就是我们刚才这样一个输出。行,这是一个输出,好这个呢,我们体验为就是调用这个属性,通过点的方式啊,对象点的方式,哎,那这个呃,方法这块的话呢,也可以通过对象呢去调。哎,调用方法,哎,通过P点你看这时候就能点出来啊,哎,我想呢,打个电话。掉扣了,哎这个我一掉扣,其实呢,就是当初你这个缝里边,哎定义过这样的功能。你看啊,我们设计这样的一个抽象概念上的一个手机,它有什么样的功能,我们具体的这个手机是不是就应该具备这个功能?对的啊,他能打电话,那我们这呢,就能调打电话这个方法,哎,所以我们这医院这个方法呢,就被调了,里边呢,这就能够拨打电话了。
13:05
好,接着啊,我们再P一点。哎,我们可以呢,去send这个message发送个信息。啊,说这个,呃,有内鬼是吧。哎,终止交易啊。诶,我把这个信息呢,我就发出去了,他呢就调用啊,咱们在声明这个缝的时候呢,这个方法,然后按住CTRL键一点就过来了,这个呢,就我们这个信息它就直接打印出来了。细节呢,咱们先不不真实去演示发送的事儿啊,来一点点来好这块我们就调用它来运行。哎,就出来了。哎,那现在呢,你还能玩游戏是吧?哎,那我们就接着通过这个P1,咱就调这个叫a play game就能玩游戏,诶除了这仨方法之外呢,我们没有去定义别的方法,比如你还想听歌啊,不好意思,诶,我们在这个设计这个手机的时候啊,诶不能听歌是吧。哎,所以这块你就哎不能够拿着这个对象呢,去调这个听歌的方法了。那就这样了。
14:01
行,就相当于你声明什么样的属性,什么样的方法,我们就能调什么样的属性,什么样的方法。哎,就完事儿了。好了,那么关于面向对象的一个整体的理解啊,通过这个缝呢,哎,大家呢,去体会一下,你看啊下边写的,哎,整个来讲。哎,我们先看这个事儿啊,整个来讲的话呢,面完成这个面向对象,整个这样的一套系列的操作,我说呢有三个步骤。呃,首先步骤一。哎,步骤一呢,我们称为呢叫诶创建类。啊,或者也称为呢,叫设计这个类。是吧?哎,创建类,然后呢,并设计类的内部成员。哎,目前呢,我们就涉及到俩,一个呢叫做属性,一个呢叫做方法。哎,你就去设计它的内部的结构就可以了啊好,这是第一步,然后第二步呢。对,第二步的话呢,你像我们创建类,这是个抽象意义上的一个概念,我们造它其实义不大哈,主要呢,就是由它是派生出具体的这些对象是吧?诶所以第二步呢,我们称为它就是创建类的对象。
15:09
哎,创建类的这个对象。哎,这就我们第二步,就像我们刚才呢,呃,写的啊,说比如说咱们就这样写的啊,Phone p等于new一个phone,这个呢,就是造对象的这个步骤。啊,然后步骤三。对,我们造完这个对象啊,实打实的一部手机是出现了,但是呢,我们目的也不是为了要造这个对象而已,而是要拿着这对象呢去完成相关的功能是吧?诶,所以呢,就是我们刚才写的这个第三步啊,哎,我们要通过这个对象呢,调用它内部的属性和方法。就这啊,通过对象。诶,调用其内部声明的属性和方法来完成相关的工程啊功能。就可以了。哎,那么这个的话呢,大家你想想咱们用的那个scanner。
16:01
其实呢,也是这样的一个过程。哎,说现在呢,我们想从键盘上来获取指定类型的数据了啊说怎么办呢?哎,注意这时候呢,不用你设计了,相当于第一步呢给你省了。Java呢,给我们提供好了,那你就直接用就行,所以第一步不用做了。哎,然后我们需要做的事呢,就是在你需要的位置啊,你先造一个感的对象。然后你想干什么呢?你说我想从键盘获取数据,什么类型int型好,那你就调它的next int方法。这个方法都在我们第一步在设计这个类的时候呢,都给你设计好了。哎,你直接用就可以了。诶,这就我们说的整个这样的一个过程啊好,那么在这个过程当中,第二步呢,我们叫创建类的对象了,诶这呢,诶我们这块呢,也提到诶等价的描述呢,就叫做类的实例化,哎所以这块呢,我们类的实例化啊,其实呢它哎就等价于呢叫创建类的对象。啊也等价于呢,也称为呢,叫做呃,创建类的实例。
17:01
都行啊,就以后呢,我要是说这个说造对象,哎,其实呢,就用这里边儿的每一个词呢都行。啊,这个稍微注意一下啊好,那具体这个格式的话呢,呃,就是我们刚才那块也写到的啊,首先呢,还是这个呃,数据类型。哎,这个呢,就是这个类类型啊,其实。然后呢,这个是一个,哎,这个叫对象名。哎,其实呢,就是一个变量名啊,然后右边呢,就是你实打实的new的这个对象。哎,创建的,哎通过new是吧。呃,创建的这个对象试题。哎,这样的一个格式啊,举例像我们刚才写的这个就是。哎,以及呢,咱们那个scanner啊。哎,C in,哎,实际上的话呢,这个string呢,我们不是说也是一个类吗。哎,既然你是个类呢,是不是我们也可以去逆啊?哎,我们可以去new一个string,这样写也行。所以我们以前不这样写呢,对此呢,其实特别。
18:03
特别特别啊,它呢,特别就在于说呢,我们可以直接右边这块统一就是双引号呢,去给它复制是吧。哎,这也是,有很多人为什么总是在思想上误认为它是一个基本数据类型呢?就是因为你右边可以直接呢,一个双引号负个值,感觉像基本数据类型一样,其实不是啊,它还可以这样付。跟着这俩有什么区别呢?以后再说。啊,这个咱们这块不是还要讲一个长类吗。在这儿是吧,哎,我们到时候说两种方式有什么区别啊好哎其像这儿呢,都是我们典型的面向对象的这样的一个,诶编写的这种方式,哎,其实这样来看,咱们数组也这样啊,这就是数组类型,数组名,然后你有一个数组是吧。哎,整体结构是一样的啊好,那么这段啊三个步骤大家要记住,它整个呢,咱们学习面向对象,或者说呢,这三个步骤贯穿在大家,哎编写Java代码的始终,两写Java代码基本上都是这样的特征。
19:01
啊,所以它非常重要,你说面向对象思想,这个思想我搞不定,哎,这呢就是落地的具体的体现。好,那么刚才呢,我们是写了凤这样的一组这个代码,然后大家下来的话呢,把它当成是一个标准的一个例子啊,下来呢,去写一写啊,诶然后下边我们在讲个什么事呢?诶在刚才我们去创建对象啊,并且呢,去调用它的属性方法这个过程当中啊,诶就涉及到这个内存当中的一些具体的体现了,所以呢,我们再通过这个,诶另外的一个代码,我们再看一下内存当中它的一个,呃,这个情况相当于呢,就是一个内存的解析啊,我们来看看这块的一个场景。好,那这块这个场景的话呢,我们再换一组例子呢,再让大家呢去体会一下,比如这块呢,我又创建了一个类,这个类呢叫做person。我们相对来说就比较熟悉一些啊,这类的话呢,也会有它的这个属性。啊,也会有它的这个相关的方法没问题,好,那首先的话,我们看这个person啊,我们都提供哪些属性呢。哎,String类型的一个name。啊,这个呢,我们称为它叫姓名啊。
20:03
还有。啊,比如说年龄in那个age。对,再来一个性别吧。哎,真点啊。啊,这个别叫了就啊。更别叫sexy哈,对,诶,这呢就是它的三个属性啊,这呢,我就写仨了,好方法。哎,人具备什么样的功能呢?吃喝。睡啊睡觉,好像别的动物也可以是吧?哎。人吃饭是吧,啊对,交流啊,Public再来个睡觉吧。哎,睡多长时间啊,来一个参数是吧。比如这写说人至少保证每天。几个小时的是吧。12个小时啊。的睡眠。12个小时,你想想,那你这个你的人生的长度呢,无形当中就缩短了好多呀,是吧,哎,还可以呢,比如说哎,人呢,比如能交流,人呢有爱好是吧,来一个比如说in trees是这样写不?
21:14
这样是吧,哎,有什么爱好呢?哎,死猪类型的一个。呃,好比是吧。我的爱好是。抽烟、喝酒、烫头。好,诶这样的话,我就写了三个方法没问题啊,这是三个属性,诶行,这个完了以后呢,我们下边呢,就可以在这个测试类里边了,习惯性的咱们把这个类和它的测试类就分开啊,在这个测试类里边呢,跟刚才咱们说这个套路一样啊,该干嘛了。加属性还没对象呢。哎,先创建对象吧。哎,创建对象或者呢,我也称为呢,叫类的实例化啊,哎实例化实例化实例呢,就是一个具体的对象了。所以实例化呢,就是你创建对象的过程啊,叫实例化就是造对象啊来声明呢叫person。
22:05
哎,P了啊,你有一个。哎,造了一个人是吧。找了个人,找人。行记。然后下边呢。哎,通过对象是吧,哎,调用属性或方法。啊,你要拿泪去掉不行啊。这个你说我调一下内幕,那你这个是哪一个人的,这个内幕是叫什么什么的是吧?哎,所以这个名呢,注意一定是具体的某一个人的啊,哎,所以你不能拿泪去掉了,一定是对象啊那。啊,来一个这个,比如说哎,杰克是吧。啊,Jack是吧,然后呢,AP一点啊。24岁是吧,呃,P一点这个真的。啊,这个哎,单引号了啊男。哎,这个呢,是它的这个属性。哎,然后呢,哎,这个属性呢,我已经附上值了啊,一旦你要附上值的话,我们再去打印它的信息呢,其实就都有了,对吧。
23:06
哎,这个我们再逗号一下吧,Age,嗯,那哎这样行啊不行,报错了,为啥。对,你这样写的话是谁的呀,是吧,哎,我们是P这个对象对象的啊,哎,这个呢,是P这个对象的A啊,这一定要注意一下啊逗号。哎,真的。这有点长了,这个咱们在这儿啊画一下行。哎,P一点,哎,我们来个真的好,那上面因为你经附上值了,所以我们打印的话呢,它就有值,哎你说诶我要是把这个放在这个赋值的上面呢。说诶你看你这块也没赋值啊。是吧,这块也没赋值,你说我要是把它放在上面行不行呢。对,它竟然没有报错是吧,而且你要运行的话,你会发现它也有值啊。哎,对,咱们这个打印原来默认值的时候。数组元素的默认值的时候,不是出现过它吗?是吧?
24:01
对这个呢,其实就涉及到我们这个所谓的叫属性,或者说叫成员变量啊,它有默认值啊。没有负呢,也有值,这个咱们稍后点再去解释啊好,现在呢,我放到下边了,哎,这个呢,自然而然就是你负的这个值了。诶,这就我们给的这个信息。呃,没问题啊好,然后呢,在这种场景下呢,我们再去调,呃,它的一些,比如说这种方法是吧,It呀。啊,这个这个呃,睡觉是吧,每天不低于。24小时啊,那生命不就结束了吗?是吧,每天就是长睡了是吧,长眠了啊。其实我觉得六个小时应该差不多是吧。啊,八个吧。行。现在关于这个睡眠有好多书都去讲啊,说对有些那个书不是说人的这个睡眠其实是以一个半小时为基本单位的。是吧,说你只要睡够一个半小时的这种整数倍呢,一般都没事儿。呃,有的,你要是比如说有的时候我们睡觉突然觉得说,哎呀睡的感觉没睡好,就是你可能是在中间一个半小时的中间这个位置呢,被人给深睡眠了,对对对,然后突然呢就醒了是吧,没睡好,这时候你再补好像就不太好使吧。
25:12
嗯,对,当然这个不同的理论啊,就是其实咱们学的好多这个所谓的一些科学的,它也是个渐进式的过程啊,之前你认为对,后来发现好像也不太靠谱啊,都在不断的哎,对认识过程当中。啊对,然后呢,这个呃,爱好是吧,杰克的爱好呢,就是。画画是吧?给那个肉丝画画嘛,是吧。啊对,那这个呢,就是我们说的这个这个对象呢,它的这个功能嘛。哎,Run一下。你看这没问题。哎,这就可以了啊行,那这个呢,就是咱们说的第一个这个过程,那这呢是咱们创建了当前这个类的一个对象,我是不是还可以再创建另外一个对象是吧。哎,我说那叫在哎创建。
26:00
A person LA。Person。啊,这个类的一个实例哈,哎,我就在创建第二个对象了,哎,创建第二对象呢,跟第一个呢,就显然不是同一个了,啊这个new呢,表示在堆空间当中找这个对象,那我现在再创建一个,是不是又得再new一下。哎,这呢,体现为你就是第二个对象,哎,那再起个名呗。P2吧,是吧,哎,那这个对象那问一下啊,这个对象跟这个对象现在有关系吗。没有啊,诶这是完全两个不同的对象是吧?诶那意味着这个对象呢,他也应该有他的一些信息是吧。哎,对,比如我们这个P2点。嗯,叫这个肉丝吧,有点太那个啥是吧?嗯,一般都翻译成露丝是吧。嗯,好,然后p2.a。嗯,是吧,大家都喜欢18岁的呀,刚成人的这个时候是吗?啊哎,P2点真点是吧。啊,这个我们叫女是吧。
27:00
哎,那么有一段话是怎么说来着。说呢一般呢,一般呢这个。两口子是吧,或者情侣俩的年龄都差不太多是吧?啊,这个。呃,如果能能差到五六岁的啊,一般都是这个优秀的男人是吧。哎,男生比女生大五六岁的,一般都是优秀的男人是吧,能够吸引啊,小一点的说呢,如果要插上这个十来岁的呢。都是杰出的男人是吧?哎,如果呢,这个俩人的年龄差上20多岁,二三十岁啊。这都是伟人是吧?哎,你要能差到五六十岁了,俩人还能结合,而且可以长相厮守,这都得是诺贝尔奖获得者是吧啊?哎。好这个呢,诶我们就附上这个值了啊,诶附上这个值的时候呢,我这时候去打印。注意看啊。我打印谁呢?我先打印P2哈。哎,我先打印P2,哎,我打印P2的这三个属性。
28:01
哎,是不是应该就是这三只了。诶,你看这呢,就是P2的啊,那如果说我在这个打印的后面,我再打印一下P1的啊。哎,你说这个P的这个name age和gender会不会也变成露丝18岁女呢?不会了是吧。诶,那这里边儿我们其实想强调的点呢,就是说每创建一个类的对象,这里边儿这个属性的问题哈,是每个对象一份啊,还是大家共用的问题。对,诶最终的结论呢,就是每个对象有一份是吧。诶,这个是不一样的,OK,好,那么关于这个代码的话呢,我们就先写成这样,那接下来的话呢,我们考虑一下这个刚才写的啊,这个代码啊,造了两个对象,这两个对象呢,在内存当中哈,诶它应该是怎么来划分的?啊,内存的一个解析的问题啊,对应的就是这个内容了,好,那既然提到内存解析了,咱们先来谈一谈理论上的这个点。
29:01
哎,我在这块呢,其实也呃有相关的这个内存解析的这个结构的一个划分是吧。啊,还是这个图哈,呃,那么又回归到这个图上,图上来看啊,整个呢,Java虚拟机负责呢,将自己码文件呢,加载到内存当中啊内存呢,呃,典型来讲我们是划分成五个部分。诶,大家这块你可能会看到这个东西是吧。这我们说叫Java逊尼的一个架构啊,它这前面有一个限制叫houseport是吧。对,这个是谁呢啊。CMD哈,Java杠,哎version哎这块呢,就是我们打印Java这个版本,你发现是11.2的这块,你看有一个。是吧,就这个虚拟机的话呢,它其实是一种官方的规范。既然是一种规范的话呢,其实你可以理解成就是没有具体的这个实现啊,呃,那么规范发布以后呢,各个厂商大家都可以呢,去根据这套规范呢,去开发自己的虚拟机。然后呢,Oracle呢,他自己也开发了一个。其实呢,也不是二维开发就散公司开发的。
30:01
其实其实也不是萨公司开发,是最早的时候萨公司买的别人的啊,诶当然最终呢,现在就是Oracle的了是吧,也就是相当于他自己发布规范自己呢,也发了一个虚拟机,那这个虚拟机呢,就是house。那么其他家长也都有,比如说像这个阿里巴巴啊,它的这个业务呢,很广,它的这个。针对于他的这个线上的系统,他就自己也开发自己的淘宝的虚拟机。啊,因为每个厂商它的这个场景使用的不一样是吧?哎,所以呢,这个场景不一样了,它为了这个性能呢更好,他就自己要去开发虚拟机了啊所以咱们现在讲的虚拟机呢,就是都是官方发布的,这个咱没有讲别人家的啊啊那么这个官方发布的这个呢,就比较具备权威性了啊他呢把这个内存呢,是分成了这样的五个部分的。哎,那么这五个部分当中,哎,咱们目前比较关注的呢,其实就是这个站,哎这个堆啊,你要再加一个的话呢,就再加个方法区。诶这两个的话呢,咱们就先不用管,后边讲这个本地方法的时候呢,再稍微提示他这个呢,我们在基础阶段就彻底不提他了。
31:02
啊,其实就是我们这个代码在执行过程当中,它得记录个地址,他呢就存这个地址的。啊,这一说有点懵啊,你就先不用管它了啊,好。那么在这个里边呢,刚才提到了我们要关注的话呢,就是这仨事儿啊,那首先提到这个站是吧,说站里边啊,针对于我们刚才呢,诶说的这个代码来讲,那这块的话呢,什么东西放在这个站里边呢。哎,跟咱们前面讲那个数组当时说的是一样哈,哎,这个占呢,就是方法内定义的。啊,变量啊,就存储在我们这个站结构当中。哎,站住。诶方法中定义变量,你看我们刚才在这个测试里边是什么没方法。哎,May方法里边定义的变量是不是就是P1啊P2啊,是不是就是啊。哎,他就算啊好,这是它,然后对应呢。哎,它呢就是存储,我们实际你拗的这个对象,前面我们还拗个数组呢,所以这块我来写啊,堆里放什么呢,我们就写啊,叫拗出来的结构。
32:05
哎,那扭出来这个结构有什么呢?哎,典型的就是。比如说是吧,哎,这个数组的这个实体。啊,以及呢,我们说的对象的这个实体。那就都在我们这个堆空间当中,哎,那么我这儿再明确一说啊,就是包括。啊,包括什么呢?这个对象中啊的属性啊。比如我们用的那个person,哎,你不是有name,有age,有gender吗?哎,这三个属性呢,注意是在。堆里的啊。哎,是在对立的,哎,包括我们这个数组实体,那不就是数组元素吗。也在队里。OK啊好,那这个方法区放在什么呢。诶方法局这块呢,其实呃,相对来说呢,它就显得稍微抽象一些啊,咱们呢,再去执行这个代码的时候呢,诶调媒方法上来就先要,诶这个声明这个类,然后我们呢去找他一个对象。
33:01
整个呢,这个类呢,咱们现在来看这就是一个类了,那其实呢,咱们大虚拟它是加载的这个自解码文件了,对吧。哎,你看这这是不是就这个词性法问题。在这看你可能不明显啊,咱们open in explore啊。哎,那这是不是就得直接码文件啊。这个磁检码文件呢,它是一个物理磁盘上的文件,然后我们诶这个调用java.ese这个指令的时候呢,就把它放在内存里了,就把整个这个为代表这个类哈,就放在内存里了,放在哪了。就放在咱们这个方法区里了。所以这个方法区呢,我们说呢,它呢是用来存放,哎,咱存放。哎,咱们这个类的模板的啊。比如说就咱们这个。诶,比如说啊,就是咱们这个,诶整个这个person这个类的模板里边呢,你定义过属性啊,定义过方法呢,整个把你这个类的整整体啊就放在方法区里了。哎,就这个意思啊,这块大家可能不太好理解啊,先不用管它,主要呢是看上边。
34:04
好,那这个完了以后呢,下边我们就来看一看这个我们创建对象了,调方法调属性了,呃,内存是什么样子的,我们来举两种场景,第一个就是创建类的一个对象,第二个呢,就是创建多个对象。好,来创建一个对象啊,直接回到咱们的课件。嗯,合件啊。诶,打开。哎,这个的。这一张是吧,打开我们这个PPT啊。好了,诶,我们就直接来看这个了,说创建类的一个对象啊,然后呢,给属性赋值了,诶我们看一下这个过程啊。好,那这个代码呢,就相当于咱们写的那个test这个类。啊,测试类是吧,诶在这里边呢,首先我们创建这个对象,好注意创建对象之前呢,我们是一个main方法,诶刚才我们复习数组的时候提到过说这个,嗯,每一个方法的调用呢,其实它对应的是一个战争。所以呢,我现在调魅方法,那么这块那个站里边呢,它就会诶压入一个战针。
35:04
那就压入进来了,这个的战争呢,它对应的是一个方法,在我们这儿呢,是没方法。哎,那么在这个战争里边呢,哎,你如果方法中内部声明的变量了,那这这呢,就成为了方法内的变量,这叫矩目的变量了。哎,方法内的变量叫局部变量啊,这个变量放哪呢?诶我们就放在这个战争里了,所以这块呢,我就有个P移了。理解一下啊,我这边就有个P了。方再说一遍啊,方法内声明的变量。就你看变量前面有个类型,这不就刚声明的吗。这个变量就放在我们这个战争里了。也就说诶,你这个X怎么不写呢。说的对,二也应该写上,只不过我没用,所以我就给忽略了。啊,你要写的也应该写上啊,哎,我就不写了,好,我只考虑P了,好它先放这儿啊,然后接下来我们拗了一个东西,一看,哦,拗了个对象啊,只要是拗出来的都在堆里。
36:01
哎,所以这块我们就创建了一个开辟了一段堆的空间哈,这段空间呢,就来放你这个对象的实体了。哎,那么这个空间一旦开辟了,就会有一个首地址。地址呢,我们给他一个。啊0X,比如说12AB哈。好,那么把这个地址呢,是不是通过赋值的方式,不就给他批了吗。所以P这块存的呢,就是0X啊12AB。哎,这个地址呢,就存到这儿了。好,存到这以后呢,我们就可以通过这个地址呢,这不就指向了你对空间中的这个对象实体了吗。哎,还没完事啊,然后呢,这个对象实体里边存的是什么呀。哎,数组里边存的是元素对象,实体里边存的是你的属性。哎,属性,哎,他正好是不是有三个属性。哎,我们在定义这个person的时候呢,这不有吗。哎,那么这三个属性就是有几个啊,哎,我们就会放几个,这块有仨,所以我们就依次呢,都放在咱们的这个堆空间里边。
37:06
哎,就在这儿。哎,首先有内幕。啊,有这个age啊,还有这个。哎,现在我们给它变小一点啊。哎,这个我们拉长一点好,这块注意咱们还没有到下边给它赋值的这个过程啊,诶这三个的话呢,其实刚才那会我们是不是也稍微的看了一下啊。哎,发现它是有值的是吧,对这个值的话呢,咱们一会儿呢,讲专门讲属性的时候呢,再说哈,那对于这个呃死string类型的来讲,它实际上是个no哈,呃,那整形呢。哎,实际上是个零,哎,真的呢。叉类型的。哎,其实也是个零是吧,OK啊,它是有这个默认值的,跟咱们数组元素的默认值是一样的啊。诶,然后这块呢,呃,相对应呢,咱们第一行代码呢,可以理解成就结束了。啊,大家要记住的点我再说一遍啊,这个对象名。
38:01
方法里定义的对象,对象名放在站里边存的是你对空间中对象的首地址值。让对象在堆空间中。啊对,空间里边这个对象里放的是成因变量。哎,记住它啊。好,那么接下来呢,我们通过P1的点的方式呢,P1找到地址点,哎,这不就点到右边这块了,属性这块了,诶依次呢去复值。哎,把这个闹呢,我们干掉。诶咱们改,诶注意这个咱们前面也说过这个事儿啊,就是这个字符串的话呢,其实要细讲的话呢,它还是有点复杂的啊,它这个在内存当中啊,放的位置呢,也经常在变啊,JDK的版本不一样呢,也会在变啊,当然呢,我写到这儿呢,显然其实是不是不够精准的啊。哎,我只是暂时呢,咱们先放在这儿,以后我们专门再去讲这个事儿啊,哎,那么这age这块呢,把它改成24啊。哎,暂且呢,咱们就先把字符串呢,就理解成放这儿了啊。
39:00
好,然后呢,真的呢,也给他。整一下。这个往这边一点啊。诶改成是男。诶那诶好了,诶OK啊,那么这三行代码执行完以后呢,咱们内存结构当中就长这个样子的。哎,所以呢,你接下来呢,你再去调它相关的属性啊,该是谁就还是谁。好,这呢就是我们说的这个,诶,创建类的一个对象,哎,给属性复制的时候呢,内存的一个结构图,哎,我把这个呢先诶。这个复制一份啊,放到我们对应的这个位置了。啊CTRLV诶放这呢,Shift加F6啊,这个重命名的啊,诶你要不记住这个没记住这个快捷键你这样哈,包括有同学呢,给这个包名改名,给这个诶模块改名哎都一样哈,诶右键这个呢叫factoror啊。Name不是shift加F6吗?那这个。
40:02
哎,这个我们对应的啊叫零一。创建类的啊,一个对象啊。好这个呢就完了,然后接着的话呢,我们再看啊下边这个图,创建类的多个对象,然后给属性复制。哎,那其中的第一个过程的话呢,我们是P还是造个对象啊,有内幕有age是吧,然后接着又造第二个对象,哎,他这块同样道理啊,只要你执行的没方法,这块呢,就是个战争啊,这块我们就进来了。那接下来以后这块稍微再长一点啊。就得这样啊。好,那么这个酶方法这块呢,哎,这个方法。啊,对应的是个战争啊,是哪个方法呢?没方法啊,一上来以后呢,这有个P。然后拼音呢,这块你有个对象,这个我就借用一下了啊。哎,CTRLC一下。啊,回过来这个我们就哎造好了,造以后的话呢,有个首地址值啊,跟我们刚才说的这个过程呢,其实是一样的啊。啊,这个0X啊3344好,把这个地址呢,付给我们这个的P啊0X3344好,他呢就直过来。
41:06
哎,这样它没问题,哎,那哎这个值的话呢,也是这个默认值,接着的话呢,我们去修改这个值,改成杰克改成24岁啊。这个呢,我们也。借用一下是吧。哎,杰克儿,哎哟,位置都挺好啊。哎,把这个闹呢干掉,哎,把这个零呢干掉。哎,这块啊好,这个真的呢,没有负值,那就还是一个默认值就行。OK,那么咱们前三行代码呢,这不就长这样的效果吗?哎,真的就可以了啊,这块为了方便呢去。提提现我这样一下啊,把它往下放一下。哎,这么着啊,好这个呢就完事了,然后接着的话呢,我们这块又创建了一个对象叫P2啊,我把这个就写到上面了啊,这叫P2。然后那个P2的话呢,呃,他呢,也拗了个对象啊也这个也拗了个对象。哎,这块我就往上一放。哎,这就新旧的对象,哎,这个对象呢,也会有一个地址值。
42:05
咱们也给他一个地值值。0X8899。好,那么把这个地址呢,就给了这个P2了啊,0S8899,诶通过这个地址值我们就指向了,哎,对空间你新创建的这个对象了。好,那么这一行代码就搞定了,目前呢,也有三个属性啊,都也是默认值。好,那么接下来的话呢,我们给这个name跟那age呢,这不又赋值了。哎,复制哎跟这个有点类似了是吧。哎,这么着啊。这个呢,我们叫露丝。啊,肉丝啊。哎,20岁。这样改的。20岁啊,行,没问题啊,好,那么这样呢,三行代码就结束了内存中,哎,你看各是各的啊。哎,所以说这里边儿我们想强调一点,就是每创建一个类的对象,我们在堆空间当中就开辟一块空间来存储你这个对象,然后呢,这个属性呢,是每个对象有一份。
43:08
哎,注意好,那么接下来的话呢,我们通过这个P1调这个A值改成26,注意P1掉的A值改成26。所以呢,你是把你自己的这个24哈。干掉了。改成26。在这儿啊。哎,这么着哟。诶往这一放,诶改成26了,好,那么这个改成26以后呢,我们问说ap2.a值是多少呢。对P2,点H还是20。哎,大家呢,不受影响。哎,就是这样的一个场景。哎,大家呢,稍微的体会一下我们这个过程啊,好,然后把这个呢,我们也给他诶。复制一份。哎,回过来啊,这个我就放在这啊,CTRLV在这,Shift f6这个是我们零二啊。
44:02
哎,创建。哎类的,哎多个,哎对象这个是第一个图啊,那这个我们再稍微的再体会一下这个图啊。哎,这个图呢,你看在我们刚才这个代码的基础上,你看一下,我稍微我就变了一点走。哎,我就后边呢,多了一个这个操作。哎,这个操作呢,我们看一看这个细节是什么样子的啊,哎,跟我们刚才这块呢,其实是呃,有一些类似的了啊,我就这么着了。哎,CTRLC啊,过来啊,CTRLV。哎,我就直接就用了啊好,然后大家再看啊,基于咱们刚才说这个场景到这儿的时候呢,这个还是20哈。这跟咱们刚才讲这个代码都一样,然后在后边呢,我又加了一个操作。说person p3,哎,只要你看到一个变量前面有个类型,这就是新的变量了。所以呢,在我们这个站这里边儿呢,是不是多了个P3呀。对啊,给我往上拽一点。不行啊,就就这啊,就P3。
45:02
哎,行啊,然后P3的话呢,你看我是拿P1负这个值啊。对啊,这个呢,就跟咱们讲数组时候的那个数组的赋值与复制是吧,跟那块呢有点类似的,往那去靠啊,这个呢,你把P1付给P3,关键就是你付的是什么。对是给地址啊,还是说你把这个批这个对象呢,完整的又复制了一份呢。哎,对是地址值,哎只要呢,咱们看到你没有new哈。就不会新开辟内存空间,哎,所以这块呢,哎,你就是把你P你这个变量存的东西给我,你存的是地址,你就给我地址,所以呢,就是3344。那既然你给我这个地址了,那就意味着我通过这个地址啊,我也能够找到你这个内存空间啊,就是堆空间我也指向你这个对象实体了。好,那么指向以后呢,我们通过P3去改一下,AP3改A是不是改的还是它。哎,对的,所以我这儿呢,把26呢也给改了。
46:00
啊啊,这边一点啊,诶改成28。哎,20啊。这呢就是我们想强调的点,大家呢,需要关注的就是,诶什么时候呢,说就就是改了,什么时候又没改,诶你看这块呢,它的这个点。啊,这个稍微的注意一下。这两个的话呢,是两个对象,所以说你改一个不影响另一个,但是这里边儿我们P1和P3它俩呢,是两个变量。变量是俩变量,但是指向的是同一个。对象。哎,这个大家注意一下啊,啊这呢,就咱们说的这个第二种这个情况啊。哎,回过来,哎,还放在这儿啊,CTRLV。在这儿我们再重命名啊,零二。哎,创建。哎,创建啊类的多个。那对象这个我们是第二个图啊好这呢我们就把这个呃对象的内存解析这块呢,给大家画了画这个图,那大家呢,稍微的体会一下啊好,那么这个内存结构图呢,画完之后呢,咱们把这个笔记这块呢,稍微的给大家呢去记一下啊诶关于这个第二项说第一个说创建类的一个对象啊,那么这个内存呢,解析是什么样的呢?诶其实呢,就建我们这个图就可以了,哎,所以我这块呢,直接写个建啊这个图就行啊,就在这儿呢啊好这呢说创建类的多个对象。
47:17
诶,创建多个对象的话呢,其实我们呃,就在这个图里边体现的就是又创建了一个对象,然后下边这个图呢,重点呢,其实我们说是这个这个的话呢,其实不算是创建新的对象了,当然呢,我们有必要把这个事儿呢给大家呢去呃强调一下啊,所以创建类的多的对象呢,诶如果我们要看这个图的话呢,这块我们其实画过两个啊对应的这个图。那这个我们换成这个二啊。诶,但是两个图里边呢,我们想给大家强调相应的这个知识点啊,下边呢,就写个这个叫强调啊强调什么呢?诶这块看一下这呢,我叫PE,咱们用了一个具体的person。啊,这是一个啊,然后呢,接着我们就来了一个P2,来了一个具体的person。好,这个呢,我们理解为呢,叫创建类的两个对象。
48:03
哎,创建了哎,Person类的,哎两个对象,哎然后呢,这块我们想强调的知识点是什么呢?哎这我写个说明哈。说呢,哎,创建的类的多个对象。或者叫创建类的,哎,多个对象十是吧。然后呢,每个对象呢,在堆空间当中有一个对象实体。啊,每个对象啊,在堆空间中。啊,有一块啊有一个。啊,对象实体。呃,然后呢,每个对象实体中。哎,保存着一份啊类的,哎属性。啊,这个属性的话呢,可能有好几个啊,哎,我这呢叫一份没说一个啊保存着一份类别属性,那么接着啊说如果呢,修改某一个对象的哎,某属性值时。哎,注意呢,就是不会不会影响是吧。
49:03
呃,其他。啊,对象词属性的这个值。是这意思吧?哎,这呢,就是我们想强的点,比如说我们这个P1哈。咱们P1这个A的话呢,它是十,然后P2的这个age呢,它是20,哎,复完值以后,这就相当于各自是各自的啊,复完值以后呢,然后你把P1的这age呢,你改成30了。哎,如果这时我们再去打印。哎,单一打印呢,我们这个P2点的A值啊,这时候呢,它是。多少?是不是还是20啊。对啊,这就说呢,就是每个呢有一份哈,然后你改其中啊,比如说P1这个对象的诶某属性age的值的时候呢,不会影响啊,P2这对象同样的age这个属性的值,因为大家各自一份。哎,这个呢,就咱们想强调的这个第一个问题啊,好,那么强调的第二个问题。哎,强调二啊强调二的话呢,这块呢,哎,其实不能算叫新创建一个对象了。只能叫新声明一个变量啊。
50:02
哎,我们这样写的。啊,然后呢,P一个P3啊,直接拿P呢,这样去赋的值。啊,这个呢,我们只能说呢叫呃声明。啊,声明类的相当于两个变量啊。哎,那么这时候呢,这个P1P3呢,算是两个变量,哎,但是呢,这两个变量指向了堆空间当中的同一个对象实体。啊,这里我们来一个说明啊。哎,说明啊说呢,此时的这个,哎,P1P3。啊,这呢,我们可以看到叫这个变量,这个变量呢,准确来讲就属于两个对象的这种变量啊,哎P1啊P3了哈,哎P1P32个变量。啊,然后呢,指向了哎堆空间中的哎,同一个对象实体。啊,同一个对象实体啊,它们俩的这个地址值啊,或者呢,我们这块理解啊,呃,P1哎,这个P3啊,它们的地址值是相同的啊。
51:09
保存的啊,地址值相同啊,这个地址呢,就是你指向对空间的那个对象实体的那个属地址值了。啊,这是相同的啊,那这就意味着哈说如果通过。那其中。哎,某一个变量啊,或者叫某一个对象。变量吧。啊,修改呃,对象的这个属性时会导致啊另一个。哎,对象变量。啊,对象变量,哎,此属性的这个值啊,这很显然的,因为你指向就同一个嘛,哎这个意思呢,就是说如果我们这个p1.h呢,这个我们是一个,哎加上负值为十了。然后现在你又把哎通过P3呢去调了A指令改成20了。哎,那这时候我们再去打印。啊,这个P点一啊。
52:00
多少?20是吧,因为他俩本身指向的就是同一个。啊修改啊属性的,呃,属性的修改对象的这个属性时,是会导致另外一个对象变量此属性的这个值。还会会导致会影响是吧。说白了你就是同一个啊好,这个呢,就是我们想给大家强调这个知识点啊,那么在实际开发当中呢,我们这样的场景会有,这样场景也会有啊,就是你自己弄清楚啊,你到底是心想造一个对象呢,还是说呢,就是同一个对象,但是呢,使用不同的变量指向呢?啊这个到时候你注意看清楚啊。好,那么这个事儿呢,咱们就,哎算是说清楚了。
我来说两句