00:00
好了,那么咱们接下来呢,继续再往下呢,各位啊,那么上面呢,说了我们的编译过程,嗯。行,那现在呢,我们这两个文件必须在同一个目录才行,对对对,有道理啊,佳慧说的有道理啊,这个咱们就不用提这个了啊啊,再提这个就太细了啊,到时候慢慢后面就知道了,好吧,嗯,那么。接下来呢,我们看一下啊,就是再往下来看一下。我们刚才说到哪了呢?说到我们这个程序啊,这块是写完了,然后对象也创建了,我们运行一下,现在是没有没有效果吧。没有效果吧,各位学生。I等于100 I等于100是因为上面输出的是不是下边这个程序是不是运行了对吧,但是呢,它没有效果呀。对吧,哎。你看小朋友又有又有疑问了,为什么润这个类的自己码没有在当前文件下也能用,这是因为什么呀?哎,它内置的class pass啊,我不在这说这个了啊,说这个的话大家就懵了啊,先不要提这个好吧,哎,先不要提这个啊,这个问题啊,这个问题你应该有这个疑问啊,但是你现在啊,还不知道是怎么回事啊,是跟那个class pass是有关系的啊。
01:20
好,我们以后再解释啊,现在先不用着急,先不用着急啊。那么刚才说哪了呢?我们编译了,也运行了,在他这个程序没有任何问题是不是,哎,没有任何问题啊,只不过没有效果是不是,但是没报错呀,运行时没报错啊,运行时没报错行,那么咱们的第八章就讲到这各位啊就讲完了。咱们呢,进入第九章的学习,所以这块的话,我们点右键啊,去新建一个新的目录啊,我们叫CHAPTER09。在这个第九章第九章当中,我们要干什么呢?哎,我们要学习的是对象的创建以及使用啊,对象创建以及使用,那就是说我们这个对象创建出来了,我们怎么去用它呢。
02:04
对不对,哎,我们现在在这里说一下啊,在语法上是怎么创建对象的,在语法级别上是怎么完成对象创建的呢?哎,是这样的啊,类名变量名等号后边加一个什么类名。啊,这样就完成了对象的创建,啊,对象的创建。啊,就完成对象创建了,各位啊,那么接下来咱们这样同学们,我把我原先写的这个程序关了啊,我把之前写的这个写的这个学生啊,我也关掉它,我再重新再写一遍,好吧,哎,再写一遍啊,加深一下印象。那我再写一遍的话,我就在这里直接点右键新建,我就不再用那个啥了啊,我就不再用那个叫呃汉语拼音了,有点太low,我这会儿改成英语单词了啊,大家看好了啊student。
03:03
行不行,你看多高端。是不是高端大气上档次啊,来。我们在这里定义一个学生类。各位。这是一个学生类啊,哎呀。来走一个,这叫学生类,那么学生类经过一个分析,有学号呗,有性名呗,有年龄呗,有性别呗,有住址呗,是不是学号的话就是印他呗,然后性别就是死润呗,是不是年龄就是印他呗,对吧?哎,性别就是bulllin呗,就这么着吧,住址就是呗,就这么定了啊来public class叫student student学生,然后呢,我们在这个位置上怎么着呢?呃,定义定义生的属性啊,比如说这个学号啊,比如说姓名啊,比如说年龄啊,比如说性别呀,对吧,比如说住址啊,哎,那学号这块就是呃,In特类型学号啊,学号叫啥呀。
04:05
学号是啥呀,就得了,这不是no啊,这不是no啊,这是各位啊,这是它缩写叫no啊学号。啊学号,然后性名的话那就内部呗,是不是年龄的话,年龄的话那就age呗,对吧,性别的话,性别的话那就gender呗,对吧,或者是sex行不行,哎,住址的话那就死润类型啊address呗。是不是你看这个换成英语单词了,各位啊,这个这以前叫。纸,你懂吗?这个叫a address address啊,Address。啊,或者叫ADR缩写也可以啊,是没有任何问题的,别多想,各位啊,这只是一个什么呀,只是一个。只是一个变量名,前面这是类型。对吧,这叫属性对吧,哎,描述什么呀,状态的。
05:02
啊,在Java程序中以什么形式啊,以成员变量的形式存在啊,他们都是成员变量,成员变量。对啊,那么接下来呢,我们这个位置写上一个做个文件里边我们去完成对象的创建,好吧,哎,完成对象的创建啊。Public class叫student test。啊,然后呢,Public static void主方法加上去,好,那在这里呢,我们可以去创建什么呀?哎,学生对象一,然后呢,我们可以再去创建学生对象二啊,然后再去创建学生对象哎,别别别别三了就二得了啊来那么一这一块的话,我们就student。
06:03
对吧,然后我们叫叫啥呢?叫S1吧,我们new一个什么呀,Student是不是有了,然后接下来这个呢,Student s2new一个什么呀,Student好了,这样的话,我们就把对象呢,就创建完了啊,我们这块呢,仍然是去看一看这个对象的一个创建和使用啊,对象的创建和使用好那么这个题目啊,我准备给大家画一下内存图。注意听啊,各位注意听啊,这个呢,我准备给大家画一下内存图,到目前为止这个程序呢,实际上和我们刚才写的那个那个汉语拼音的那个学生啊,是一样的是一样的啊,只不过刚才没画内存图,我现在呢画一画内个图啊,我说一下我现在讲解的是关于第九章对象的创建和使用这块的东西。啊,首先这块呢,我觉得应该把内存图给大家好好画一画啊,只有画了这内存图,诶,你才知道这个程序是什么意思啊,是什么意思。好了,呃,来一起看一个图啊Ms PI啊,把这个打开,打开之后呢,我们一块儿来看一下,首先是这样的各位。
07:08
注意听啊,关键时刻。来,咱们这样吧,关键时刻打个一走一波一各位来。咱们精神一下子啊,精神一下,因为啊这个至关重要,至关重要啊,你后边学好学不好,那就要看你听我这个当前的这个内存图了。对,你要是能听懂当前这个图,哎,那么OK啊,你后边学起来就轻松,如果我当前画的这个图啊,你没明白是吧?哎,你不懂,那么这个时候将来学后边的东西就稍微困难一些,所以在此处呢,我郑重的强调一下,先声明一下,我接下来要给大家画的这个图啊,画的这个图。非常的重要啊,来关于这个对象的。直接起个名字叫和。
08:01
注意听啊,来那。最大化吧,各位最大化的话,我这边可以画更多的东西啊,我呢,呃,看不见你说话,你先不要说话啊,先听我讲啊。整个这个东西咱们画大点啊。这个呢,就是我们看到的Java虚拟机GM,然后呢,我们曾经说过GM当中啊,它主要有三块空间,是不是是主要的三块空间啊,然后呢,还有什么呀,有这个叫做堆是不是,哎还有什么呀,还有个叫做栈是不是哎站啊。把这个。那么这块呢,我们写上这个叫做方法啊,然后呢,这个叫做。啊内存,然后这个叫做占。啊内存啊占内存,那么这块呢,我给大家诶给它抹掉啊抹掉好走。那是这样的各位啊,还记不记得方法区里边存什么?
09:01
存什么?各位方法区中存什么?存代码片段对吧?哎,在这里方法区存储什么呀?哎,代码片段啊,代码片段code。啊。哎,然后呢,在方法区是最先有数据的啊,因为累。最先被什么呀,加载啊类被加载,那么这个是我们的一个方法去占呢。站这块我曾经给大家说过,站当中就是说方法调用。对吧,哎,压站。对不对,方法需要的内存。在哪呀,占中分配吧,哎分配占中最主要,占中最主要存储什么。存储局部变量啊,存储局部变量啊。
10:04
最主要存储局部变量,你明白,哎,来这块呢,我画一个框出来啊,画个框出来好,这是说谁呢?哎,这是说。战。各位啊,这个站里边存的是什么,我画个箭头啊,是这么回事儿,它呢主要是方法代码在执行过程当中必然会调方法,你只要调用方法,他就会在站里边给这个。方法分配空间,然后在这个方法里边是不是有局部变量啊,局部变量是在方法当中的啊,局部变量是在方法当中的,局部变量是在方法当中的啊,方法当中的。好了,那么堆里边存什么呢?各位这块呢,我要重点给大家说一下了啊,凡是出来的对象都在堆里边存储。注意啊,注意听重点啊,凡是通过new运算符。
11:06
创建的对象。啊,都存储在什么。都存储在堆内存当中。啊,六运算符的作用就是在堆内存中开辟一块空间。New就是新建的意思,明白吧,哎,新建的意思,那么这个是一个重点,各位啊,这是个重点,来标一下红色,然后呢,我给它连上去啊。来这边呢。拿一拿一个线连一下啊好堆内存存储这个方法,区存储这个,占存储这个啊,各司其职,各司其职,各位啊,各自有各自所存存储的东西,那么现在我问大家一个问题,大家思考一下,这几个内存空间里边变化最频繁的是哪个?
12:02
是不是?你有没有发现站好像就是一个啥呀,哎,就像一个这个。发动机呃,发发动机比如说活塞对吧,哎,发动机活塞压站弹战压战弹弹压,因为你方法在调用结束弹调用结束调用结束调用结束压站谈战嘛,所以这个站的活动啊,它是最频繁的啊,压站谈战啊站的活动最频繁啊。站的活动最频繁啊,一直压站弹战。啊啊,压站团战,压站团战,压站团战。然后堆呢,在程序执行过程当中,要new对象,只要造一个对象出来,对象存储在堆应内存当中啊,对象存储在堆应内存当中,对象存储在堆内存当中。啊,局部变量存储在占中。
13:01
该背的背啊,该记的记,那么这块呢,咱们把这个图啊好好看一下啊,各位大家看这个程序啊。看这个程序。那么首先呢,我们这个程序啊,会进行类加载。他会把这个student test这个类装载一下。那么这个地方大家看是不是有个string这个类啊。String这个类是不是也得加载,就是你这个程序在编译的时候需要这个类,需要这个类,又需要student类,所以他会把这个类,把这个类还有这个类是不是都装载到我们的方法区当中,那么也就是说实际上将来在这块它存储的是谁呀?student.class有student什么test.class这个文件怎么着啊,它也有,还有一个叫什么呀?string.class是不是都有啊?有的老师怎么突然又出来个string.class今天上午的时候,我有没有给大家说过,就是string这个东西,它其实也是一个类,对吧。它既然是一个类,那么我们用到这个string的时候,类加载器是不是会去找这个string加class啊,因为毕竟在你程序里边是有个string啊,对不对,哎,它就会用你这个string啊加载进来,那么这边其实就是我们所说的哎,一个代码片段其实就哎加载完了啊,这是一个代码字节码啊,都在这放着呢。
14:17
啊,那么接下来呢,我们先去执行的是什么?是我们的焖方法,各位那么焖方法执行,他就会给这个焖方法呀,分配空间在哪分配啊,在战里边分配明白吧,哎会在这哎分配,这叫压战,这个呢是属于闷方法战争啊,叫做焖方法战争。你明白吧,哎,这个闷方法就是闷,这是闷方的活动空间,对吧,这是一个闷方法的叫做闷方法的活动空间是吧?哎,闷方法的一个活动空间。是活动空间。就在这活动啊,在这活动,那么紧接着呢,我们执行第八行代码,这个第八行代码大家注意啊,是先执行等号左边还是先执行等号的右边啊,诶,那当然是先执行等号的什么呀?右边对不对?将右边执行结束之后的这个结果赋给等号左边的这个变量是不是大家看一看,我先问大家一个问题,各位啊,分析一下S1属于局部变量吗?
15:26
好,这个问题你答一答啊,I等于多少啊,100。我问你I属于不属于局变量?I属于局部变量吗?当然是,对不对,那么你student。对应的是int,你int是基本数据类型,我student是不是就是一种引用数据类型,你I是一个变量名,那我S1是不是也是个变量名?我曾经给大家说过,当你一个变量的声明是在一个方法体当中声明的话。
16:00
我们的这个变量的名字啊,我们这个变量就属于什么局部变量,所以大家想,S1现在是不是也属于一个局部变量啊,S1啊也是一个什么?哎,局部变量属于局部变量吗?答案是,当然是啊,当然是各位,S2是局部变量吗?是S2也是局部变量啊,也是局部变量。各位啊,我再强调一下,这个I是不是在方法里边声明的,这个S1是不是也是在方法里边声明的,I是局部变量,S1是不是也是局部变量,局部变量在哪存各位?注意局部变量存在哪局部变量存储在占内存当中。还记得吗?对吧?占主要存储什么局部变量,因为你的IS1和S2这三个变量是不是只能在方法里面用,假如说我在这位置上,Public public static void method,我在这个方法里边,我system.out点打印,我输出I,然后呢,我访问一下这个S1和S1和S2,这个是不是都有问题啊,对吧?哎,我们来编一下编译啊,然后我们d chapter09我们进去看,看来student.java student test.java我们走一个Java c形成Java走好,大家看我们二十二二十三和24是不是I找不到,S1和S2是不是都找不到,对不对,哎,这个I找不到,S1和S2都找,这说明什么呀?这说明出了大括号啊,就不认识了。
17:39
这说明I还有S1,还有S2,这三个变量都属于局部变量啊来iii s1S2都是main方法中的局部变量,在这里是无法访问的啊,无法访问的,所以这块呢,是编译就报错了啊,不能这样做啊,不能这样做好了,那么接下来呢,咱们继续再往下啊,那么刚才说到哪这个注释掉吧啊,这个代码注释掉啊,刚才说到那说到这个等号右边先执行,记住先执行结束的结果通过等号的方式复制给。
18:17
左边的这个哎,变量啊,复制给左边变量。好了,呃,那么接下来呢,咱们看一下啊,是等号右边先执行,怎么执行new student,那么。注意听啊,关键了他new这个student对象的时候,他直接在这就就就就就开一块空间出来了,开了一块空间啊,那么这就是那个对象,各位这就是那个student类型的对象。Student类型的对象,各位啊,这个类型的对象。那么。大家注意啊,重点来了,在你创建这个对象的时候。这个对象是不是来自于这个模板。
19:00
对吧,来自于这个模板是不是好,那我问你,那这个对象刚创建出来之后,他这个对象的学号是多少。他这个对象的姓名是多少?他的年龄是多少?他的性别是什么?啊,还有他的家庭住址是什么。对吧。哎,我说一下啊,之前我们曾经有一个东西是怎么说的。变量必须干什么?变量必须先干什么?声明再赋值才能访问?是吧,先声明在负值才能访问。那么大家想,现在这个变量,它没有在这个位置附上一个110啊,或者是120并没有赋值对吧,没有赋值是不是,哎,记住了,成员变量没有手动赋值时,系统默认赋值。
20:00
注意啊,注意对于成员变量来说。啊呃,没有手动赋值时系统默认。赋值。负的值都是默认值啊,负的值都是默认值。嗯,那么默认值是什么对吧?哎,那么在这里呢,我先给大家。往回倒一下子,大家看看啊,在嗯,数据类型这一块,讲这个数据类型的时候。这块是不是有一个缺省默认值。Bit short in long float doublelin差是不是都有默认值?对吧,它的默认值,你看bit short默认值都是零。对不对,是零,Double也是零。对不对,哎,False,如果你是布尔类型,它的默认值是false,看见了吧,哎叉的话,它的unicode编码是杠U0000啊,杠U0000。
21:09
所以这块呢,咱们要知道八种基本数据类型,它的默认值。就是现在说到哪呢,就是说对于我们一个引用数据来说,引用数据类型来说啊,如果我们的成员变量没有手动赋值,我们系统会默认赋值,赋值赋什么值列一下。呃,类型注意啊,默认值把它列一下啊,其实bit short in long float double booing booing char啊,然后还有什么呀,引用数据类型啊,大家看这个string是不是就属于引用数据类型啊,这是基本类型,基本类型基本类型引用类型引用类型对不对?那对于这个它的默认值肯定是零喽,是吧?那对于这个name来说,它的默认值是什么呢?哎,是一个none。
22:04
各位啊,这个单词发音叫none啊来我们来看它的默认值啊,BAT默认值零,你就你就这么理解零是吧,哎,零然后呢,这个是零对吧?F然后这个是什么呀?叫0.0F然后这个是什么呀,我们的0.0这个呢,默认值是false,这个差的默认值是什么呀?叫做杠U什么0000是不是,哎杠U0000啊然后引用类型,它的默认值是呢。是什么意思啊,表示空啊,是一个Java关键字,全部小写啊表示空。表示空是引用类型的默认值,对,是引用类型的默认值,各位啊,那是引用类型的默认值,默认值这个大家要知道。那么大家想一想,思考一个问题啊,我不知道大家现在有没有跟上我的节奏啊?
23:00
这种成员变量是不是应该是一个对象一份。大家分析一个问题啊,分析一下对于成员变量来说。是不是应该一个对象有一份儿啊?理解什么意思吗?就是李四,李四的学号。张三有张三的学号对吗?李四和张三的学号不一样。所以应该有两块不同的内存空间,对吗?大家好好思考一下,你比如说我们姚明和潘长江,他俩都属于什么,都属于明星对不对?哎,都属于明星这个类,他们都有一个属性叫身高,但是我问大家一个问题。
24:03
这个身高这个属性具体到某一个对象上之后,听我说啊,身高具体到某一个对象上之后,是不是这个身高的值不一样。大家承认吧。承认吧,所以身高这个变量在内存当中是不是应该是一个对象一份?姚明应该有一份。潘长江应该有一份儿。是不是,那对于我们这个学号是不是也应该是这样的。对吧,哎,这个学号还有姓名,还有年龄,还有性别,还有家庭住址,我们都是不一样的。你有十个学生,那你应该有十个学号。是不是,哎,所以说这种变量又被称为什么呀,这种成员变量啊,这种成员变量又被称为实例变量,好各位。
25:04
什么是实例变量?什么是实例变量?各位什么是实例变量?实例是对象对吧?或者对象又被称为什么实例对吧?实例变量实际上就是对象级别的变量。对吧,哎,你比如说我们有一个什么呀,Public class叫做明星这样的一个类,然后我们这里有个什么呀,有个叫做double,我们叫身高,对吧?哎,我们叫身高height。高度是不是那身高,身高这个属性啊,所有的明星对象都有,但是每一个对象都有自己的身高。
26:05
都有自己的身高值。对吧,假设创建十个。明星对象。He变量应该有十份。所以这种变量被称为什么呢?对象级别的变量。属于实例变量。各位实例变量。实例变量啊,实例变量,这个这个变量又有新的名字了,各位啊,被称为被称为实例变量啊。好,那么现在我问大家一个问题,你们去思考啊,咱们今天代码不多,大家发现没有,我们都是理论上的东西啊,就是说实例变量。在访问的时候。
27:00
是不是必须先创建对象?假如说我们要访问这个身高这个值的话,我们能不能用我们的类去访问它。我们可以举个例子,各位现在前边这个位置上是不是有它的。学生的一个学号。学生的名字对吧?好,那我问大家,现在我们在这里直接去访问一下。访问姓名访问学生姓名可以直接通过类名吗?学生姓名是一个什么实例变量对吧?实例变量是对象级别的变量对吧。是不是应该先有对象才能谈?姓名是不是应该先有对象,先有对象才能说?
28:08
姓名的事儿,来我们尝试一下啊,这个类呢叫做student,然后直接点各位啊,点访问谁呢,访问一下这个内蒙,这样行不行各位。就是我们现在不造对象。不在这个地方创建创造对象,我们直接通过类名去访问行不行?我们编译一下就会报错,大家看Java c形成Java编译,好,新Java编译啊好,大家看第11行啊,这个错误你现在看不明白,你现在看不明白啊,什么无法从静态上下文中引用非静态变量内吗。这个呀,你看不明白,我也先不做解释,但是这个第11行确实错了,第11行确实错了,这个不能这么干,不能通过类名啊。
29:01
跟static没关系,先不要说static啊,不能通过类名啊来访问什么,不能通过类名来直接访问实例变量,各位啊,这个事儿了解一下。
我来说两句