00:01
行了,同学们,咱们开始上课啊,首先的话,我们还是先这个简单回顾一下我们上午的这个内容。那么我们上午这块呢,实际上最主要是说了两块吧,对吧,哪两块呢,就是第一个就是关于封装这一块,那么封装这一块呢,我不知道大家有没有记住那两步啊,第一步是干什么呀?还记得吗?第一步是属性,什么私有化?是不是属性私有化?然后第二步呢,给这个属性提供什么呀,公开的什么方法呀,赛的方法和什么,哎,Get方法是不是,哎,我们可以把这个上午的这个课堂笔记打开是不是,嗯。来。就是封装这一块的事儿,我们上午主要讲了对吧,那这两步这块第一个呢,属性私有化,我觉得这个应该是没问题的,因为我们为了保证什么呀,我们的数据安全,所以呢,我们加了一个关键字叫什么呀,Private是不是哎private修饰之后呢,这个属性是不是只能在我们的类本。
01:07
本类内部访问啊,在外边是不是就访问不了了,实际上是不叫安全了啊第二步的话,呃,我们不能太安全是不是啊,什么叫什么什么什么叫太安全,就是说。我们既然提供了这个数据,我们在外边访问不了的话,那自然提供这个数据也是没有意义的,那于是呢,我们第二步呢,在外在这个本类当中提供一个哎,Set方法和一个什么呀,Get方法。那么方法和方法这一块呢?呃,一个是什么呢?就是关于对我们数据的一个什么呀,修改是不是啊,而get呢,就是对我们数据的一个读取啊,当时呢,我给大家说了啊,这个赛的方法呀,和get的方法呀,你现在怎么着呢?哎,你还是只能定义成什么呢,我们的实例方法。不能加这个static啊,不能再static,那从这开始呢,我们开始讲这个所谓的实例方法了啊,那么实例方法我再强调一下,实例方法你就这样去记也行啊,实例方法就是对象的一个行为。
02:09
啊,如果是静态方法,那就是类的一个行为。类的一个行为。啊,然后这个set方法和get方法这块的一个,呃,定义的规范,我在这里呢,大家说一下set方法呢,是set加上我们属性名首字母大写。Get呢,是加上我们属性名首字母怎么着啊,哎,大写是不是,然后呢,在方法有一个参数,Get方法是没有参数。我们提供set get的目的是让用户只能通过我们的set方法或者是get方法去访问我们的属性,那我们在这个方法入口这块,我说了就可以设立什么呀,所谓的关卡。是不是,哎,设立关卡之后呢,我们的数据啊,就可以保证它的安全性啊,就可以保证它的安全性。好了,那这个呢,是关于我们的一个封装啊,下去之后呢,呃,你把这个呢,好好的捋一下啊。
03:05
嗯,那今天上午除了这个封装之外呢,我们还说了一叫sta个关键字,Static关键字这块呢,咱们其实也写了很多这个例子啊,我把这里的这个class文件删了吧。删了之后呢,这块呢,我们一个一个看吧啊。一个一个看第一个。第一个呢,最主要是告诉大家一些概念,普及一下,是不是static修饰的什么东西叫什么啊,主要是说呢,Static呀,被翻译成什么静态是不是,然后呢,我普遍的统一的给大家说了时代这个修饰的东西呢,我们叫静态的。比如说修饰变量我们叫什么呀?静态变量修饰的方法我们叫什么静态方法,那如果说不带代的话,那这个可能就是实例变量对吧,那不带sta的方法呢,我们叫实例方法,那总之实例变量和实例方法这两个都是对象相关的,然后呢,我们这块的静态变量和静态方法都是需要我们类去直接调用的啊。
04:02
直接调用的第一个。那紧接着呢,第二个呢,我们再看一下第二个在这块啊,我最主要是想向大家传达一个什么信息呢?像我们在这里定义了一个中国人这样的一个类,这个类当中有个国籍,国籍这一块。加上sta还是不加,那取决于说我们这个属性它的值。会不会跟随着对象的变化而变化,什么叫跟随着对象的变化而变化呢?比如说Chinese是吧,那是中国人这个类,那它国籍不管是通过他创建出的哪个对象,他的国籍,他其实都是中国。那既然是这样,我们没必要说把这个static去掉,如果把static去掉的话,那就表示说我们这个呀,是一个实例变量。它存储在什么地方啊。哎,实例变量它就会存储在这个。叫什么叫什么呀,叫堆是不是,哎堆里,那么如果是创建十个对象,那么这个就有十份。
05:00
所以呢,有点浪费我们的内存空间。那为了节省我们内存的开销,在这里呢?我们在前面加了一个static。加了个static之后呢,我们这个变量啊,在我们类加载的时候执行。啊,就这个等号中国赋值给它赋值什么时候附上值啊,是在我们类加载的时候就给它初始化了,那你要注意这两个变量的初始化是在我们new这个对象的时候,我们new一个Chinese的时候,这个变量和这个变量这叫实例变量就附上值了。那在类加载的时候,诶这个就附上值了。这个加上static表示静态变量在方法区里边存储。方法区想想啊,就是说到目前为止,你要知道咱们这个三个主要的内存空间,一个是方法区里边存静态变量,还有一个是叫做堆区里边存的是我们的实例变量,还有一个叫做什么呀,占区是不是或者占内存占当中存储什么呀?哎,我们的一个局部变量啊,局部变量。
06:00
其实我们Java开发这块一共就三个变量,一个静态的,一个实例的,一个局部的,局部就是我们方法体系当中的,实例呢,就是我们对象里边的。静态呢,就是我们类相关的了啊类相关的好这是这个啊,然后紧接着呢,再往下第三个,我们最主要呢,给大家讲解的是什么内容呢?哎,就是说呀,我们啊实力的。哎,我们用什么呀,引用点的方式去访问,我们静态的呢?哎,我们用什么呀,叫做类名点的方式去访问。是不是,哎,我们用类名点,但如果说你要用这个引用点的方式去访问,行不行,没问题。没问题啊,但是这种方式我说了容易让别人产生困惑是不是?哎,说你用CE去调用,那这个con它肯定是一个实际变量啊,其实不是用空的引用去访问它,它也不会出现空值异常。用一个空的引用去访问静态的东西。
07:00
它在运行的时候还是用类名去访问的。实际上和这个对象没有关系,所以呢,我们这里啊,啊要注意啊,它不会出现空指针异常,这是这个,那么再往下第四个案例呢,最主要呢,是告诉大家呀,我们从这也开始说方法了是不是。那方法这块也一样,你静态方法用类名去访问实例方法呢,你就用对象用好之后你用你就用引用去访问它。如果说你空的引用去访问一个方法,同样会出现什么呀,空指针异常。那这个do some为什么出现不会出现呢?因为这个do some方法是静态的,那下边这个通过我们的do other为为什么会出现控制异常,因为我们的do other是一个实例方法,实例方法就需要对象对吧?那这个是空引用访问它,那肯定出问题的,出问题的。上面的do some不应该这样访问,不该用ST去访问,应该不应该有对象,因为do some这块怎么着啊,哎,我们是静态的,直接用类名去访问不就行了吗?还是那句话,你用ST去访问的话,那我们认为你这个do some方法呀,一眼看上去像一个什么呀,实例方法啊,实例方法。
08:10
那么说完第四个例子之后呢,第五个例子啊,在这里啊,大家就产生了一些困惑,是不是就是我抛出了一个疑问,什么疑问呢?就大家以后在开发过程当中啊,你说我这个方法到底定义成static静态的方法,还是说我们定义成实例方法呢?就是不加static还是加static在这里呢,我给大家说了一个。标准啊,一个参考标准,这个参考标准呢,当时大家呢,可能是听不太明白,我在这里再强调一下啊,我说慢点。实例方法呀,这个东西啊,其实。他呢,你听这个名字嘛,对不对,实例方法那就是什么呀,实例是什么呀,对象呗。就是对象方法,那么对象方法呢,它的调用啊,我们在之前啊就给大家说过了,像这样的方法调用,我们必须得先new对象,New了对象之后呢,我们调去调用这个方法。
09:04
啊,如果你是静态的方法,我们就不需要用对象了,直接采用类名点的方式去调用。啊类名点的方式去调用,那当时怎么说的呀,各位。怎么说的呀啊。如果你这个行为。在发生的时候。会因为动对象的变化而变化,我不知道大家理解没理解这句话,我说。你这个行为,比如说考试这个行为。对吧,考试你不能用一个泪去掉。考试应该是说真正发生的话,我们应该是有对象参加的。因为你每个人的考试结果不一样。所以像这种行为我们认为是。对象级别的行为。那这样的。一个行为就必须得用实例方法了。
10:01
这是我从这个思想上。思想的角度啊,给大家普及是吧,就这样说怎么说呀,如果这个行为和动作。是需要对象参加的,是属于对象本身的。比如说打篮球,吃饭跑步对吧,哎这些呢,都是需要我们人,哎这个对象亲身参与的,像这种行为我们就定义为什么呀,实力方法。但这毕竟是一种思想,对不对?思想这种东西呢,有的时候不是特别的靠谱,所以我紧接着上午在最后的时候,我又给大家说了一个另外的一个代码级别的参考标准。这个代码级别的参考标准是什么?就是可能跟思想就没啥关系了。我主要啊看啥,看你这个方法里边啊,有没有访问实例变量。如果说你在这个方法的大括号里边去访问了这个实例变量。那么你想一想实例变量这种东西。
11:02
是不是必须有对象才能去访问它?对不对,严格意义上来说,我问大家这个name,这个name大家想想是不是我们上面的这个实例变量。实例变量。怎么访问我之前怎么讲的?各位实例变量应该怎么访问,我之前怎么说的?实例变量访问的语法机制是什么?如果大家还记得。那当然太好了是吧,我现在再重复一遍啊,它的语法机制是什么引用点。啊,后面跟什么实例变量名。大家自始至终是不是都是这样访问呢?比如说我们现在想访问这个name。是不是把这个对象扭出来,我们去点内啊。
12:03
对吧,只不过现在我们可能没有办法去直接点name,因为这个private修饰的是私有的。但你是否还记得我们原先在这里写一个随便的一个class t,假如说我们T里边有性ID,现在我访问这个ID怎么访问,访问ID怎么访问呀?访问T的ID怎么访问,你是不是应该t t new呀,New one t是system.out.printline,打印printline打印输出什么呀?叫引用点是不是叫引用点,是不是引用是谁T呀,T点什么呀,AB。这个ID是不是这样访问的呀。对吧,以前我们是不是这样访问,那现在大家好好看看这里。这个name是不是也是实例变量,这个ID是不是也是一个实例变量?
13:03
对不对,那实例变量怎么访问,是把对象扭出来,然后t.ID对不对,那你这个name怎么访问。有同老师name好,我们在这个大括号里边就直接system.out.print打印输出name不就行了吗?严格意义上讲,前面是有一个引用的,各位引用点的。啊,因为name是个啥呀,Name是个实例变量啊,你想访问这个实例变量必须得有对象啊,严格意义上前面是有个引用点的啊,那么这个引用点我今天下午有可能就会给大家讲到,就是谁呀,哎,This。This,到时候呢,我就会给你讲到,你就理解了,只不过这个引用点是可以省略的。啊,那么这个地方这个引用点是谁,这个this点是谁,这个this代表就是当前对象。当前对象。啊,那我问大家一个问题,你去调这个实例方法好好听啊。
14:00
你去调实例方法,你用什么user去调它会不会有问题,你用user如果直接调这个print name1这个方法的话,你想想你是不是没有new对象。你没有对象,你当前对象在哪呢?我提前给大家透露一下啊,这个name啊是实例变量。实例变量怎么访问呀?是不是得先拗对象才能去访问呀?你现在访问这个name,我问大家是不是也是访问实例变量,严格意义上来说,访问实例变量是不是应该先用对象才能去访问它,所以这个name前面是有一个引用点的。今天下午有可能会讲到这个东西,只不过这个引用点呀,可以怎么着啊,省略不写,其实这个东西就是this.this点可以省略不写,而这个this代表的是什么?就是当前对象。那如果你要采用name名去调这个方法,Print name1这个方法的话,你是用name去调的,当前对象是不存在的,当前对象不存在你怎么。
15:09
去内蒙。是不是啊?你好,想想。你这加一个static对吧?哎,你用这个类名去访问它类名访问之后呢,这个name是谁的呀?谁的name啊,这谁的name啊,谁的name啊,谁的name是哪个对象的name,这个name是哪个对象的name,谁谁谁谁谁的name啊。你如果采用一个类名去访问的,你静态的,你把这个声明成静态的方法是不是静态方法是不是只能通过类名去访问,类名是user user.print name1你用它去访问的话,你想想在这个整个过程当中,整个第49行,看看看准这个49,你49行是不是整个这行代码,整个过程当中根本连个对象的毛都看不见,是不是你又对象了吗?你在这个过程当中,User print name1你是不是根本就没有对象,那你在这个大框里边,你访问的是谁?你访问的还是当前对象的名字,那你当前对象在哪里呢?当前对象在哪里呢?
16:21
对不对,你用一个类名去调,你没有对象啊。你说没有啊,所以你像这种情况就编译报错了,编译报错你你是静态的,我是用类名去调了,但是你这里有实例变量,你在大关里边访问了这个name的实例变量,这个name实例变量你访问了,这就不行。那就不行,也许我讲完这个this你就理解了,各位,我现在还没有给大家讲这个this啊,还没讲this。好一会儿咱们看看this讲完之后,大家这个实例实例方法到底到底理解不理解啊,现在编译就报错报错对吧,你定义成静态方法就有问题,你定义成静态方法,你觉得name是谁的呀?是谁的name是谁的name。
17:04
你静态方法执行得用一个类别去调它,你整个大块执行过程当中根本就没有对象,那你这个name是谁的name,这个name是不是必须得是有对象才有name啊,有对象才有name。哎,所以说现在其实你也应该能够知道这个set和get方法,为什么是不能加static,你加上tic,那你这个ID是谁的ID啊,你这个加上static,那你这个ID是谁的ID啊,是吧,你把这个static去掉,去掉static,那这样的话是不是代表是实例方法。实例方法是不是应该你有对象去调这个方法对吧?是不是应该有一个对象去调这个方法。那我问大家这个ID是不是就是那个对象的ID。你是不是应该有个对象去调这个方法,那你将来这个大块里面执行的时候,这个ID是不是应该就是那个对象的ID啊。对吧?哎,你再想一想啊,你再想一想,没关系啊,如果说这个东西你没有太听懂的话,我觉得没关系,This呢,我会让你理解的,我一定会让你理解的啊,你不用太担心,嗯,来,我们编译一下这个程序肯定有问题啊,哪出问题啊static test05。
18:14
点下了走。好,来看第71行。啊。是吧,有问题不行,你把它去了,没事了去了。去了可以,你看49出问题了是不是?哎,这是另外一个问题啊,70行没问题了,因为你这块变成实例了,你这边就不能用类名去调了吗?49肯定会出问题的是不是?哎,那你这个时候是不是就只能用对象去调这个方法,你拗一个对象user X new一个user对吧,或者是user y呢?New一个user new完之后这个对象有了,然后接下来你再去Y点什么呀?哎,我们调这个实例方法叫print name1,那大家想一想,我们这个print name1是由Y去调的,Y是不是指向了一个对象,所以这个行为是不是这个对象触发的,这个对象触发的这个行为。
19:05
就这个对象去触发的这个行为吗。对吧,那你在这个大括号里边输出的这个name是不是就是这个对象的name啊。你看这就可以了。可以了。对吧,嗯。好,这个简单回顾到这儿吧,各位,哎,简单回顾到这儿。咱上午呢,其实就说了这么多东西,各位啊,这么这么多。
我来说两句