00:00
好了,那么刚才我们说画图嘛,是不是画图,那在这个刚才说到哪,说到我们这个程序啊,是new这块呢,我们就会创建一个对象出来,那么说S1是个局部变量,S2也是个局部变量,拗出这个对象啊,它就会在这个堆里边会创建出个对象来,好那么大家想一想,这个对象里边是不是应该有学号,有性名,有年龄,有性别和住址,而且学号、姓名、年龄、姓别和住址是不是都应该有默认值。是不是应该都有默认值,我说了这种变量啊,它叫做成员变量,而这种成员变量又被称为什么呀?实例变量,为什么叫做实例变量,因为它是对象级别的,因为你每一个学生对象它的学号都不一样,你十个学生那十个学号,那你这个内存空间是不是应该开十份啊,是不是?哎,那么大家注意了啊,是怎么回事呢?哎,当你创建出这个对象的时候,诶。他这个对象啊,它的这些属性,它会自动。系统给它附上默认值。
01:02
系统给他附上默认值,所以我们在这里啊,可以不用给他一个值啊,系统会给他一个默认值,这是跟局部变量不一样的,各位啊,局部变量你还记不得我们之前讲过的,假如说在这个位置我们有一个变量叫I system.out点打输出,比如K变量,如果我们直接访问会出什么什么问题,这局这是局部吧,这是不是局部变量对不对?哎,我们编译一下,哎,尚未什么初始化吧,走你看可能尚未初始化变量K,那么这个就不行。啊,各位看好了,这个就不行啊,这种代码是不行,但是如果你变量诶写到这个位置上你懂吧,那就大不一样了啊,这种变量你写到这儿那就不一样了,哎,大家看变量在哪啊,是在这个位置上写着,这叫什么变量成员,而且叫什么实例啊,实例变量来,那么这个时候啊,它就会在内存里面怎么着啊,哎,会在这儿。
02:00
开出来等于几呀,零对吧,然后紧接着它还有啥呀。String name是不是来在图上表现一下啊,这是int number啊string name等于那然后接下来呢,再往下是什么呢?哎,我们来看一下啊,是int age啊int age等于零,然后呢,再往下再是不玩类型sex等于false,然后最后一个呃,Address家庭住址等于那这样的话,哎,我们这个对象就创建完了,各位。啊,这个对象当中啊,哎,有什么呀,我标一下各位啊,有这么一个哎变量,有这么一个哎变量,有这么一个变量,哎,这样一个变量。还有这样一个变量,这些变量属于实例变量。这些变量都是实例变量,在哪存着呢?
03:03
在。对,当中。所以对象存储在堆内存当中,堆内存存储对象以及对象的实例变量啊,堆内存中存储对象以及对象的实例变量啊,以及对象的实例变量。各位啊,实例变量重点标一下这个字,来,我标成红色啊实例变量各位。站里边存啥?还记得吗?局部变量是不是在这儿。局部变量是不是在这儿,实例变量是不是在这个里边。在对象里边对吧?啊,对象里边注意各位啊,这个就被我们称为什么呀,对象了啊对象了,那么这个对象在堆内存里边开出来之后,这个对象肯定会占用一定的空间,对吧?那么这个空间它是有空间地址的,这个空间的地址付给了谁?付给了我们的。
04:07
S1这个局部变量,大家看S1是在main方法当中,所以你这个S1的画法应该怎么画呀?哎,应该画到这个地方,你这个位置有一个student。这个S1变量里边保存的是什么东西呢?哎,注意了。你出这个对象,这个对象在堆里边,它是有内存地址的,它这整个这个对象的内存地址赋给了S1这个局部变量,假如说是0X1231234这样的一个内存地址,那么这个0X1234这个地址是谁呢?哎,其实是这个对象的地址,而这个地址指向了什么?哎,指向了我们的这个对象啊,指向了我们这个对象是这样的一个一个情况,各位啊。S1是局部变量,各位啊,S1是局部变量,好了,那么像这种变量当中保存了一个对象的内存地址,注意0123的是这个对象内存地址啊。
05:11
0X1234是这个对象在这个堆当中的内存地址。你明白这个0X1234啊,是对象在这个堆当中的内存地址,然后付给了这个变量S1,那么现在我告诉大家一个消息啊,像这种变量里边保存了一个对象内存地址的这种变量有一个特殊的名字啊,当然它是局部变量在这啊有一个特殊的名字,它叫引用。各位啊,叫引用像。我在这写吧,哎,知识点新的知识点一一会一个一会一个啊像什么呢?像这种S1变量。保存了对象内存地址的变量。
06:02
变量啊,有一个特殊的名字。叫引用,各位啊,我们把这个S1呢叫做引用。叫引用,各位能接受吗?反正你不能接受也得接受啊。叫引用。说谁是引用啊。一是引用,别说S1是对象,各位啊,别说S1是对象。对象和引用不一样,对象在堆内存当中。啊,然后我们多内存当中,这个对象的内存地址赋给了一个变量,变量去保存这个内存地址指向了这个对象,把这个变量叫做引用。就是引用各位,这样的话,这个代码就执行结束了啊,S1叫做引用,S1这个局部变量叫做引用,那么S2呢,S2啊S2也叫做哎,也叫做引用。
07:13
叫引用啊,有一个名字叫引用。啊,好了各位,那么接下来这个程序会怎么着啊,继续往下走,它走到这个位置上的时候还是等号,右边先执行,会创建出一个对象来,然后对象的内存地址付给这个局部变量。啊,你要你要懂这个代码执行顺序啊,此时他会在这个位置上怎么着啊,会再去创建一个对象,而这个对象也是student类型的对象,那么这个对象当中啊,它也有什么呀?哎,也有这些信息啊,比如说number等于零啊对不对?哎,Name等于none啊是不是,哎,然后接下来age是不是,哎,等于什么呀?零啊然后呢,布尔类型sex等于什么呀?哎,False,然后死string类型的ad点对吧,等于呢?
08:04
那么这个对象创建完之后注意了啊,这些变量,这些变量叫做实例变量,一个对象一份,你这个学生对象的学号跟我这个对象的学生的学号不一样,你的学号是123,我的学号是456,咱俩学号不一样,所以这个变量是两份,各位是两份啊,你要注意听这个变量是两份,哎,两个对象两份,一个对象一份啊实例变量是一个对象一份,要么怎么叫实例变量啊,实例是不是有对象啊,叫对象变量吗?对象变量实例变量对象变量啊,一个对象一份实例变量。哎呀,这块呢,还是非常非常之重要的啊,这种实例变量是什么?一个对象一份啊,是一个对象一份,那既然是一个学生对象一份,那我问大家,你没有对象你能访问吗?刚才我在这里给大家演示的,通过类名的去方式去访问,让不让啊,根本不让,对不对,那你把对象创建出来之后,能不能访问呀?哎,我们一会再看好吧,哎,我们会再看,那么接下来这个对象,哎执行到这儿,这个对象串建出来之后,它的对象内存里赋给了S2,那S2是局回,所以在这个时候,我们是不是在这应该有一个叫student s2等于比如说0X2356 0x2356,它是什么呢?哎,其实它就是这个对象的内存地址。
09:23
这个对象它的内存地址,然后呢,在堆内存里边的一个内存地址付给了我们的这个局部变量S2啊,付给了SR来,那么这个S2呢,又被称为什么呀?哎,被称为引用啊,这个被称为什么?哎,引用各位啊,叫引用啊,谁被称为引用,哎,S2也是一个引用。然后呢,我们这个对象这个引用保存内存地址指向它,那么接下来这一块就指向这个对象啊,指向这个对象。好了,那么现在呢?我在这里给大家解释一下啊,什么是对象?对象与引用的区别,对象和引用的区别,对象是通过new出来的,通过谬出来的,在堆内存中存储啊,叫对象引用式是什么啊?但凡是变量啊,但凡是变量,并且该变量中保存了内存地址指向了堆内存当中的对象的都叫做引用,各位啊,所以说严格意义上来说啊,挑不出毛病啊,等号右边是出来的对象在堆内存当中存储,然后它堆内存当中这个对象的内存地址给了变量S1,而S1就保存了一个对象的内存地址指向了堆内存当中的这个Java对象,所以我们把S1有一个特殊的称呼叫引用。
10:58
把二也称为一个引用啊,一个用,其实他俩还是局部变量对不对,因为在方法当中啊,在方法当中。
11:07
好了,那各位现在呢,我们想跟大家说的是什么呢?如果你想访问这个对象里的这个学号,那你就通过一去访问,如果你想访问这个对象里边的这个学号,你就通过S2去访问。去访问啊,S1去访问,这是S2去访问各位啊,来我们尝试一下啊,尝试一下,来我们问一下。System来注意啊,怎么访问实例变量?怎么访问实例变量语法,我说一下各位啊,语法注意听了啊,语法是什么?语法是引用点。啊,然后是实例变量名就行了。啊,怎么访问实例变量。嗯,system.out点打印输入谁呀,比如说一是吧,点什么呀,Number这不能随便写啊,点后边这个number是谁。
12:10
就是你这个变量的名字。啊,然后system.out点打印输出再来对吧?S一点什么呀,Name对吧?哎,把这个复制一下拿过来,拿过来S一点什么呀,Age s一点什么呀,Sex一点什么呀,啊address是不是,哎,那么接下来我们是不是可以考虑把这个拿过来,然后呢,我们放到这个S2,把这个S2这块扭出来之后,我们这块改成S2S2S2S2S2是不是访问S2的学号,S2的name s2的age s2的S2的。那么这个时候呢,我们再去编译一下Java c行Java编译之后Java去运行啊,我们叫做student test,好大家看是不是00FALSE none,零档0FALSE none,在这个和这个之间,是不是我们可以考虑打一条线出来。
13:07
打一条线出来,来,走,打一条线出来,来,我们再来编译,再运行。好,你看这是两个对象,各位两个对象啊,两个对象你看一点number s21.name S 1.age,就这个语法啊,引用点实例变量名。引用点啊,你不能通过这个啊。不能通过student点啊,Student点不行,为啥不能student.name因为name是什么变量实例变量,实例变量访问是不是得先创建对象,有了对象是不是才能访问它,不能通过类去访问它,对不对,为什么不能通过类去访问它呀,原因是什么呀?原因是我们这个每个人的名字啊,它不一样,每个人的学号也不一样,你肯定跟对象有关系,你得在程序里边先把对象扭出来,然后通过S一点的方式去访问,点的方式,点的方式啊去访问好了,那现在大家想想,我们现在是不是把这个内存里边这个数据给它读出来了。
14:01
好的,注意注意听课啊,注意听课,我程序到这儿之后,我能不能把一的学号改一改。对,程序执行到此处,我可以修改S1这个学生的学号吗?就比如说现在我想让我这个number这块给它改成什么学号,给它改一下。我想给它改成100,什么意思,就是我想把这块内存。给他改了。你明白我的意思吗?把谁把这改了。然后不把改了,我还想把这改了。比如张三。是吧,哎,我还想,我还想把谁呀,我还想把这改了。我想把这改了。啊,然后把年龄改了,把性别改了,把家庭住址也给他改了,那我要改的话应该怎么办呢?S1.number,你看程序完了继续走呗,是不是S1在这啊对吧?S1.number等于什么呀?学号110是不是s1.name是什么呀?哎,你name大家知道它的类型是死类型,是字符串,所以这个时候大家想这个位置是不是应该跟字符串,我们叫张三呗。
15:15
对不对,哎,S一点什么呀,Age年龄的话,那就是比如说20岁得了,然后一点什么呀,Thanks性别,哎写上真得了,对吧?S一点什么呀,叫做address家庭住址写上,比如说啊,这个叫深圳宝安区,那么这个时候我们是不是就相当于执行这段代码,通过等号的方式,是不是就相当于把这个内存里面这个数据都给它改掉了呀。对吧,哎,就通过等号赋值啊,叫通过等号赋值,通过赋值的方式将内存中实例变量的值修改一下,修改一下啊然后呢,system.out点打印输出,比如说我们这里写上去,我们叫学号,哎学号等于什么呀?S1.number是不是,哎拿过来贴过来贴过来贴过来贴过来来S一点什么呀,Name谁呀,Age谁呀,哎a name age,然后sex性别对吧?哎,Address,然后这块的话,学号姓名对不对,然后年龄,然后是性别,然后是住址是不是,哎我们来。
16:25
看一看,哎,这是不是就改了呀,改了之后我们在这儿是不是就访问呀,来Java c去编译一下Java去运行。你看原先的时候,它的默认值是0NONE啊,0FALSE none啊,但是到了这儿之后,他的学号就变了,学号啊,姓名啊,年龄啊,性别啊,住址啊,它就发生了改变啊,发生了改变,这样访问就可以了。啊,这样就可以了。还是比较简单的访问。跟就跟复制一样吧。还是负值啊。还是复制S1的这个点,还是翻译成的S1的,S1是谁?
17:06
就学生一嘛。S1的学号改一下,S1的name改一下,S1的改一下,S1的性别,S1的家庭住址改一下。对吧,哎,能不能重新再次赋值啊,再次赋值S一点什么呀,Ad点给它改一下,比如叫北京大兴区是不是,哎,那你再c.out点打印输出输出这个住址。对吧?哎,我们住址是什么呀?哎,加上去我们的S一点A点二就可以了。然后就把堆里的实例变量改变了,对,改变一下啊改变一下。来我们这块呢,再编译一下,我们再运行。在运行啊,运行是这样的一个结果,对吧,现在的住址是北京大兴区,那通过这个例子最主要是想跟大家说一说,什么是对象,什么是引用的一个一个东西啊,什么是对象,什么引用的一个东西啊行,咱们下课先休息个十分钟啊。
我来说两句