00:00
大家好,我是海波老师,接下来我们继续来讲Java面向对象的相关语法,我们这里啊,拷贝一下我们的程序,来咱们拷贝咱们把它改成20啊,来把后面的这个咱们给它删掉啊,咱们点击OK,点击完成以后把这里面东西全删掉,把这个文字呢,我们也去掉,把它都去掉就可以了啊那么我们之前提到啊,类中声明的属性啊,其实就是类的变量,所以我们写上一个class,我们叫做U20,好,写完之后呢,在里面添加一个属性,咱们叫public,写上string啊,写上一个name就可以了,那么我们说过了这个语法呀,跟我们之前所学的变量的语法是非常类似的,但是区别就区别在于这个访问权限了,对吧,我们的变量啊,大家看一下,我们这写上一个叫string name,诶,我们之前讲过啊,你这个地方它就是一个变量的声明,那么这个变量的作用域啊,只在咱们大括号的范围内是有效的,对不对,而我们的这个属性,它不仅仅在这个大括号里面是有效的,你这个对象在哪使用,这个属性就能在哪用。
01:00
所以它的这个作用力的范围要更大一些,这个没有任何的问题,而且呢,我们也说过,咱们的变量啊,在使用之前必须要初始化,这就意味着我们这里打印的时候,我们的name诶是可以的,但是如果呢,你这里不写的话,它的语法就会出现错误,你鼠标放上去,它会告诉你,你当前的这个变量没有被初始化,对不对,诶这是我们变量的一个问题,但是呢,你到这边你会发现没有问题,咱们来。咱们叫U20U,它等于new u20对吧,你写完了以后,然后呢,写上u.name然后打印一下,点一下,然后呢打印你会发现语法上是没有任何问题的,你把这个注掉。做掉以后我们运行你就会发现我们当前的这个属性啊,其实它的值就是个nu,我们讲过为什么是nu来着,诶很简单,因为它的这个类型呢,叫周串类型,而周串类型呢,我们称之为叫引用数据类型,那么引用数据类型的话,它的默认值就是个呢,如果你是个基本数据类型的话,比方说整型就是零,浮点型就是0.0,我们的布尔类型就是我们的force,我们讲过吧,对不对?同学们,所以这个我相信大家都没有问题。
02:12
但是如果我们的属性值不想被修改怎么办?什么意思啊,我的这个地方的属性值啊,比方说你写上它叫u.name他等于张三。如果你这么写没有任何的问题,但是呀,可能你不小心啊,在后面的使用当中啊,你忘了,哎,你把U的点name呢,干嘛呢,你变成了我们的李四了,同学们,如果你要这么写的话,那不就有问题了吗?为什么呢?因为你前面已经给它复制为张三了,你后面又给他复了一遍,你忘了呀,那这个时候你打印那结果就发现他不是张三了,他干嘛呢,变成了李四了。所以啊,我们运行一下。运行以后你就会发现我们当前的这个结果呢,就是我们的理事了,这个可能不是我想要的呀,也就意味着我不希望在我复职之后对它做修改,我该怎么办?同学们,这就是我们接下来要给大家讨论的一个问题,如何在保证我们给数据初始化之后不去修改它,所以我们这里说一下我们的Java中。
03:14
它提供了一种语法,可以在我们数据初始化后不被修改。它提供了这样的一个操作,那么使用关键字叫final。这个关键字就能帮助我们来做约束了,就意味着只要你初始化之后它就改不了,诶老师啊,这个怎么体会呢?比方说我们不说别的,我们final就可以修饰我们的变量,所以咱们这里说一下同学们来。Final它可以修饰变量,什么意思啊?变量的值它一旦初始化后,它无法修改,啥意思啊?同学们来往下走,咱们叫name,它等于王五好写完了以后,你鼠标放上去,你会发现它根本就不让你改,他说了我们对final修饰的变量是不允许重新给它赋值的,不就是这个意思吗?大家能不能明白什么意思?所以final可以修饰变量,这个是没有问题的啊好了,诶,那么你final可以修饰变量,那咱们这儿呢?所以同学们在public后面我写上一个final,你会发现我们的final,诶,好像报错了。
04:24
爆出的原因是什么呢?我们鼠标放上去,他怎么说的呢。他说我们的name它没有初始化,诶老师你不说了吗?我们的这个name不需要初始化呀,我们的Java虚拟机可以给它默认初始化呀,这里就需要给大家解释一下了,如果用final来修饰我们属性的话。那么Java虚拟机它无法自动进行初始化。那怎么办?那么需要自己进行初始化,就是这个意思,同学们,这个大家能不能明白诶,那也就意味着我这么写是可以的,好,我写上一个我的理事,你写完以后,这边是绝对不允许改的,你可以用,但是你不能改,诶所以跟前面是一个意思啊,只要你修饰它,它就不能变了啊,所以我们这里说一下我们的属性值,它不能发生变化。
05:18
好了好了,我这里呢,把这个给他助掉一下啊,助调一下,我现在有个问题啊,我不想在我们的这个位置就给它进行初始化呀,为什么呢?你这样的话,初始化的话,我这用起来就不方便了呀,那怎么办?我还是希望在外面给它传进去,所以啊,大家还记得吗?咱们的构造方法就是专门用来做属性初始化的呀,也就意味着我们的初始化没有必要非得在这做呀,你把这个地方去掉是可以的,去掉以后你写上一个叫public,然后呢叫U20,你这么写,写完了以后干什么呢?我在这地方写上一个string,诶写上一个string,然后呢,给他个name,你这里啊,就把咱们的这个name给他不就完了吗?所以我写上name,它等于name,我这么写。
06:05
诶,老师不对呀,你这里不还是没有变吗?诶没有变的原因很简单,是因为我们当前的这个属性名称跟我当前的这个参数的名称相同了,你相同了以后,在这个地方是区分不出来的,也就意味着你的这个name呀,它认为你在自己给自己赋值呢,那你说它这可不就没有值吗?所以它还会报错,那我怎么区分我的参数跟我的属性呢?非常简单,我们有一个专门的对象,咱们叫做类对象,这个对象就表示当前对象的这个name属性,而你的这个name它表示的就是当前的参数,你这么写不就没问题了吗?你写完了以后,你在这个地方给它写成一个网五,你写完以后我就通过外部呢,把我的参数传给了final,修斯的值在以后当中是绝对不可以改的,大家看一下,你把这个打开,它肯定不允许改,对不对,诶就是这个道理,好了咱们来运行一下。
07:04
运行以后我们来看结果,你会发现跟刚才其实是完全相同的啊好了同学们,这个呢我们就给大家说一下,所以呢,我们用final修饰的什么变量啊,属性啊,有的时候它的值不能发生改变,我们就把这个呀称之为叫常量。所以来咱们说一下,一般将我们final修饰的这个变量,我们称之为叫常量,或者叫不可变。变量这个大家能不能明白,就是你的变量的值呀,它不能发生改变嘛,对不对,同学们,这就是我们给大家说的意思啊,好了,那这个给大家说完了以后,那这个final只能修饰属性和变量,能不能修饰方法呢?给大家解释一下,它是可以修饰方法的,就意味着我在这个地方给它来,我写上public,然后呢,Word我写上一个test,好同学们,我写完了之后呢,那我现在呢,在它的这个地方我加上一个final,诶老师,那你加这个final有什么作用呢?你这里又不涉及到改不改的问题,所以啊,咱们这里给大家解释一下,来写上它final啊,可以修饰我们的方法,但是这个方法。
08:13
它不能被子类重写。所以啊,你可以修饰,但是它所谓的不能改呀,说的是不能被子类给它改了,怎么改,不能重写它的逻辑呀,所以我们这里呢,干嘛呀,我得写个子类了,叫class,然后呢,我们写上一个叫CHILD20,好,放过来,我是把这个方法呢,我是原封不动拿过来,拿过来以后把final去掉,然后呢,把它们两个类建立关系,我写上继承,然后呢叫U20,我写完以后,大家有没有发现我这个程序就不对了,不对的原因就在于鼠标放上去,他就跟你说了,我们当前的test方法是不能够重写我们父类中的方法的,因为它用了final修饰,就这么简单啊,所以我们final可以修饰方法,但是方法不能被子类重写,所以啊,一般情况下我们用这个final来修饰方法呢,就是把那个逻辑给我固定死了,我就不让你们改,对吧,你们可以继承我,但是我就不让你改我的逻辑,就是干这个事用的,为啥呀,因为你改变我的逻辑了,就可能会导致逻辑上出现问题嘛。
09:18
所以我就不让你们改,就加了一个翻动修辞,好把这个给它做掉。那好了,那我的这个翻译啊,可以修饰我的变量,可以修饰我的属性,还可以修饰我的方法,那能不能修饰类呢?同学们能不能啊,其实它也是可以的啊,所以呢,我们这里来,我们写上一个我们的final也没有问题。我们这里复制一下,然后呢,把这个去掉,我们final可以修饰类,诶那你修饰类怎么个改法啊,同学们,你说你方法呀,有个重写的概念对不对,你重写的概念的话,表示改的意思没问题,那你的这个类你说你怎么个改法呢?其实也有改的方式,就是子类,也就意味着final修饰类我们的类它就没有子类了。
10:03
所以啊,有这样的一个限制,我们试一试啊,我刚才不是有一个child的吗?我现在把这个打开,打开以后把这个注掉,注掉以后呢,我们再把这个里面的东西我们也注掉,好都蛀掉了以后,你会发现我们这里标红了,标红的原因呢,你鼠标放上去,它就会提示你,你当前的类是不能继承U20的,你看看不就有这样的提示吗?所以啊,我们的final修饰的类是可以的,但是它就没有子类了。好了,那么就说明啊,我的final可以修饰类啊,那我的final可以修饰变量,可以修饰属性,可以修饰方法,可以修饰类,还能修饰什么?哎,对了,能不能修饰我的构造方法呀,所以把这个final我们拿过来,然后呢,把这写上它,咱们叫public,咱们叫U20啊,写个括号,把这个呢给它写上它。诶。老师,你不说final可以修饰方法吗?为什么我们当前写个final不行呢?我鼠标放上去,他怎么说的,他会跟你说我们的Mo file修饰符final不允许在这儿,所以啊,它不能修饰构造方法,所以final不可以。
11:08
不可以修饰构造方法,好了,把这个都去掉就可以了。行了,这里咱们说一下就可以了,因为其实大家想想也能明白吗?我们的final修饰的构造方法是意味着它不能够被重写吧,构造方法怎么可能重写呢?不可能啊,因为父子类的构造方法名字都不一样,你怎么让它重写呢?这个构造方法本身就没有这个功能,没有这个功能的话,你加final不就没有任何意义吗?对吧?诶,这就是我们final的一个注意点,诶老师,那还有没有呢?我告诉大家还有为什么呢?因为除了我们的变量属性方法类,还有构造方法,还有一个叫方法参数,我们这里呢,把这个给它来助掉,二来助调。租掉,然后呢,嗯,把这个去掉就可以了啊,把这个呢,我们该租掉也租掉啊,来除掉好了,住掉以后我现在干嘛呀,给我们的方法呀,哎,对了,这个咱们也租掉了,都除掉啊,我这里写上一个方法,咱们叫public,写上一个word,然后写上一个test,然后括号,括号以后同学们,我这里写上一个string,然后呢,写上name,那这个时候呢,我用final给大家来声明一下,这个时候你会发现没有任何的问题,对不对?那这个时候我们的效果是什么呢?我们的name,它等于我们的理式,你会发现这是不允许的,所以鼠标放上去,它会告诉你你当前的这个参数,它其实采用了final修饰,所以啊,我们这里就要给大家去解释一下了,我们的final是可以修饰我们的方法的参数的,它可以。
12:36
修饰方法的参数。那么一旦修饰。一旦修饰,那么我们参数就无法修改,无法修改,所以啊,这个也是我们需要注意的,那么你通过这个就会发现我们的这个Java中这个final关键字啊,它的用途还是比较多的,对吧?它可以在不同的场合下去使用,可以修饰不同的语法,这就需要大家自己下来练一练,给他记一记了。啊好了,同学们,我们final就先讲到这里。
我来说两句