00:00
下面呢,我们来继续学习scanner的这个超类构造的一个案例,这个案例呢,我就不举了,因为前面我们已然把这个流程说的还算比较清晰了,就是按照那我每个举了个例子,把这个流程分析了啊分析了,那下面呢,我们接着来看下一个叫复写字段,好,这个呢是一个比较有意思的一个现象。这个复写字段呢,是一个比较有意思的现象,我们来看一下什么叫复写字段。OK,复写,有些地方呢,也称之为重写。我们前面研究了一个方法,是方法的重写。那么在Java里面呢,的确有方法的重写,但是我要问大家一个问题啊,在我们刊中呢,子类改写父类的字段,我们就称之为复写或者叫重写字段,那么复写字段呢,需要使用override来进行修饰,就说我们一个字段的复写。那么也要用override来写,那么讲到这个开的复写字段呢,必须或者说有必要跟大家说一下Java中的这个字段的一个复写的问题,首先先说一下Java中只有方法的重写,没有属性或者叫字段的重写。
01:16
那么以前同学们在学Java的时候呢,老师一定讲过,一定讲过,就是我们Java里面方法可以重写,但是字段呢不能重写。啊,那为什么说呢?因为准确的讲,在Java中它叫隐藏字段代替了重写。影像字段在Java里边,字段为什么不能重启?这有一个文档,我总结了一下。然后呢,我们来看一下这个一个文档,就是字段隐藏的一个案例啊,只有把这个讲清楚了,我们回头再去看,开了这个复写字段,你会理解的特别的深刻,而且突然又感觉,哎,撕开了,这种机制确实是减少了很多容易混淆的地方,这点我觉得还是非常不错的,非常不错的。那么我们来看一下Java中字段为什么不能重写,它是怎么一个机制,我们来聊两句。
02:08
我们来聊聊两句,打开我这里总结的一个文档,我们来搂一圈。首先呢,我们这里有一个小小的案例,这个案例呢,大家一看就知道,这是一个super超类,这是一个子类萨布,它继承的数盆里面呢,都有一个S,这有个S,这有个S没问题。Man,那现在呢,我这里有一个类叫field over writing writing,那现在呢,这有个主函数,我创建了一个C是一个。子类对象的引用,那么我这里c1.S,请问这是输出什么?c1.S输出什么?Sub very good very good啊,这就是sub没问题,那么紧接着我又创建一个子类对象,然后我把这个子类对象交给了一个负类的引用C2,我用C2输出S,请问输出什么?
03:06
Super,怎么还有人说S呢啊,同学们。这个不应该啊,同学们,但是没关系,在我这里你什么错误都可以犯,但是你们工作了以后就不能犯错了啊,那我告诉大家,这个地方输出的是。Supper。那么这个地方其实就体现出一个什么特点呢?这样就体现出其实我们这个字段并没有真正的复写这个S,它只是把只是在指指令里面隐藏掉它了。那那么我们这边有几个重要的原则,如果同学们以前学Java没有学,学清楚的这一章要认真的听啊,你把这个听懂了,我告诉大家,对大家还是非常有帮助的,你会突然发现,诶,Java有些地方理解的好像更明白了,首先刚才我们看到,那现在为了证明刚才我们的观点呢,我先把这段代码给大家。整一下,待会呢,我们还要用这段代码来讲解其他内容,好,我先快速的写一下这段代码。
04:07
好,现在呢,我们在这里写一个叫Java类,叫字段的Java的。字段的over right。Over right。Over,它其实叫overloading啊,那么起个名字也可以啊,好,现在呢,我写到这里来。Already。好,我们看它这个名字叫什么名字,我们就取给它保持一致吧,啊,Reading reading。RI找到这R,好,就这个单词吧,好,那现在呢,我们呃,用这个class走。好,写一个组方法,然后呢,我先写一个super,注意听super写个非常简单的,里面就搞一个S等于super。没问题啊,这个代码就写完了。
05:00
紧接着呢,我再写一个子类,注意听好subber subber呢,我让他继承super。然后我在这里面也写一个string s等于一个sub。哦,等于一个sub。学生。好,这个地方呢,他报了一个错误,这种报错误的原因可能是因为我在别的地方已经定义过了,对吧,已经定义过我其他地方过,那就干脆我们把叫做SUPER2 super2super2,因为名字呢,确实不好想,好啊,那就SUPER2吧,这样它就也是OK的,那现在呢,我们来创建两个对象,创建两个对象OK,那第一个对象呢。我们就叫SUB2。OK,那就上就OBJECT1吧,我们就object object OB or CC。等于六一个上班。好,然后呢,OK了,那么紧接着呢,我们再垫一个super。
06:02
Super,那么这个C2等于六一个super,哎,还还还是sub啊,说错了,S,好同学们,现在呢,我们来执行或者来输出它的一个内容叫c1.S。好,下面呢,我们再输出,对,我们再输出一个叫C2.s,这个没没问题,那么这个地方我们可以看到它会输出sub。而这个地方呢,它会输出super,好,那么我们先运行一下。我们先运行一下这个代码啊,非常简单,我相信同学们都能看懂,都能看懂。那这地方我要引出的问题是什么呢?我同学这段简单的代码,我想说件什么事情呢?各位同学,我想说的问题是这个问题大家看这里。我们创建两个sub,但是为什么第二个对象打出是super呢?其实按理说你们应该感觉到很奇怪才对,为什么呢?因为。
07:04
你这个地方明明是S的嘛,你只是因为一一个引用指向了它哦,你就打super的,这怎么说得过去呢,好,它是这样子的啊,来理解一下,在这个Java的一个手册里边,官方手册里面,他写了一一段这么话,这段话呢,我们就翻译一下,翻译成一个中文呢,是这样子的,从上面的这段解释中我们可以看出,我们可以看出。成员变量不能像方法一样被重写。再加Y0,它是怎么做呢?当一个子类定义了一个跟父类相同零字的字段时,子类就定义了一个新的字段,也就是说在它的底层里边,其实子内有一个部分,腹内有个部分,它们之间是。分开的,那么这个字段在父类中它被隐藏掉了,是不可重写的,就是说父类里面你是不能真正的重写它的,它只是被隐藏了,那怎么来掩掩掩示这个被隐藏的效果呢?是这样子的啊。
08:05
因为。因为既然是隐藏的,那我就可以想办法去获取到它,那么如何访问到被隐藏的字段呢?两个方法,两个方法,第一个采用负类的引用类型,这样隐藏的字段就会被。使用了对吧,刚才我们刚才我们的样子不是,你看刚才我们用这个你你这个sub,我把这个sub这个引用交给一个负类,我用户类去访问,我就访问到负类的东西了。这是第一个,第二种方式呢,也可以强转。将子类类型强制转化成负类,我也能访问到你被你隐藏的字段,比如说C,我这样写也可以访问到。哎,我就是想访问这个,你看。你你这是一个子类,我要强转啊,大家看我就强转它什么呢?C1我先强制将其转成super。
09:00
二好转完了以后。转完了以后,对,我再去访问这个S。打仗。这个地方我应该。再扩一下。对不对,再扩一下好这对,那这个时候其实就是相当于说我这虽然是C,但是我把你强调c super这个负类,我还是可以访问到,就说通过。通过强转。通过强转。强强转,仍然可以啊。忍忍然。仍然可以访问到,访问到被隐藏的字段,被隐藏隐藏的字段,那么我们可以看到,这个时候呢,它就会输出是super了。哎,就竖好,我们执行一下这样的代码也非常简单,对不对,非常简单,大家一看到效果,诶跟我们想的是一样的,没问题,好,由此我们推出了这么一个小结,什么小结呢。这里面主要是涉及到一个Java里面字段隐藏的概念,父类和子类定义那个同名的字段不会报错,但对于同一个对象,用父类的引用去取值,或者取字段的时候,取到是父类的字段,用子类,用类的引用去取这个字段呢,就会取到子类的子类的值,就是说它通过它是看什么呢?它是看你的这个引用的类型。
10:22
而且我们在这里面有一个要求啊。就是在实际开发中,要尽量避免子类和父类拥有相同的自断比,这不是一个好习惯。就说如果你只能有个有个名字跟父类完全一样,其实是特别不好的,因为有时候你自己也不知道用的是谁。所以这边一个结论是这个结论。好,我们把这个结论抛出来,就是对于同一个对象。对于同一个对象,把这个结论先给大家拿到这里来。我们讲这个呢,得出这个结论是这样子的。好的,我们把这段代码的结论放到这儿下面。下面代码的一个小结,诶,小节是这样子的。
11:05
第一点,哎,第一点。对于同一个对象会怎么样,用父类引用,用子类的引用就知道这个。当然有同学说,老师,这些我以前都知道啊,为什么还要讲一遍呢?是这样子的。你们会突然发现在SC里面这样用就跟Java里面完全不一样了。也就是说,如果在开里面这样去访问,你会发现得到的值全部都是之类的。啊,为什么所以说要把这个先先讲清楚,然后呢,我才能把里面的原因给你们讲清楚,好这是第一个说完了啊,第一个说完了这地方我们解释了一个回顾,或者说简单的回顾了一下Java里面这个字属性,它是不能重写的这么一个特征,好这个讲完以后呢,我们再来看一个Java的另外一个重要的。特性叫动态绑定机制。
12:02
动态绑定机制,同学们在学Java的时候,老师一定讲过,好,如果你一定讲过,现在请大家花两分钟时间看一下两个代码,然后问这输出内容是什么?好,待会儿我请一个同学说,给大家两分钟。给大家两分钟。好,同学们,我们来。看一下这个题啊,呃,我先我先把这两先把这段代码呢,先给大家放到我们笔记里面,这个代码我再不写了,很简单。好,很简单,我们先把这段代码给大家整理到这里来。好,我先整理一段代码,是这个,就是我们的Java。好,这个地方呢,我们叫做DEMO吧,就是这个叫做动态绑定的一个DEMO机制,Java的。Java的dynamic dynamic dynamic动态的一个机制,Finding。
13:05
班定的一个机制。好,我们先写到这里,同学们走。好,呃,注意听。然后呢,为了省事啊,为了省事,我呢这边就偷了一个懒,我把这两个呢,代码已经给他准备好了,我就直接放过来。而这因为这段代码完全没什么技术含量,再写一遍除了浪费时间,那就是浪费时间啊,所以说我把它呢,给大家已经准备好了,我付过来,待会呢,我重点讲的是它的一个机制。好,这写完了,写完过后呢,这一段我们发现他报错了,报错原因就是因为类名肯定冲突了,那老规矩我们加个A。B力,这样子呢,我就把名字冲突的问题解决了。好写完了,写完过后,我们我们来呃来创我们来运运行一下啊,我们我们先来测试一下,这边有两个代码。好,我把它放到这里了。好,我把这段代码呢放到这里,注意听啊。
14:00
代码非常的简单,非常简单,我现在呢,把这个B。BB。好,引用呢,我恰恰给的是A,我故意这样搞的啊,改成这个OB节吧。这边改成欧杰。O obj这边也改成obj。好,同学们,我们来看一下。第一个题输出什么内容?首先我们先来看此时此刻你是一个子类的,就说你本身是一个子类的,一个在对,在这个对象,在这个数据空间,你给的是一个子类的一个地址空间,你把这个子类交给了A。好,这边你是。是将。注意听说明啊,将将一个子类子类的一个对象。对象地址。付给了啊,交给了啊,也可以交给了一个,这个AAA当A当然是个负类了。
15:01
负类的这个引用。好啊,如此的话,我们来看OB节点上,我们这个流程应该是怎么走呢?先看一下。这个BB里边,因为你目前是OB节,他在内存空间,它实际上是个子类,所以说在调用方法的时候呢,他其实先是找自己这边有没有这个方法,他发现。有。有待会我再下结论啊,我们一步步来,这个时候I加10I就这边有,所以说20加20,这个应该返回一个事实。没问题,这个很简单,紧接着呢,在这个地方上一也很简单,是I加十,这个应该等于30,好,此时此刻这个结论咱就出来了。哦,咱就说一个是40,一个是30,这个没有任何的困难。一个是40,一个是30,我们只看这个结果,我们发现是完全OK的,现在的问问题是我要开始做一个改进了,同学们请看,我将上一注销。
16:10
上我我将上注销,请问此时此刻这个地方应该输出什么?好,同学们,请看你如果把这部商户注销的话,他现在找的就是上面这个方法是不是。是不是?是的话,现在呢,我在这里面又掉了get I,问题的关键是在这个get I它。返回是多少?它实际上是调返回谁,它返回的应该是20的这个是吗?还是说负列这个十啊好,所以说它总共这个结果是多少呢。30啊,这个是30,好,我们先执行一下,看是不是这样子的。好,我们一执行,我们发现的确返回了一个30的值,这个也也是OK的,好,我把上一也在注销一下。
17:05
我把SUM1注销了过后,它掉的是上面这个SUM1,那这个时候这个I到底是返回谁呢?它返回的是这个I,还是返回的这个20的是I呢?十是吧,反正同学们有些同学还是肯定的,有些同学就要么就很疑惑,要么就不敢说了,好,我先告诉大家,这个地方整个这个整个这个结果,这个地方调上面它是十,然后这个这方也是十,这个整个这个结果是。20。好,我们再来看是不是这样子的。好,整个这个结果呢,我们就发现跟我们分析的是一样,30和20,好这个题的关键其实只要你知道两个结论就可以了,老师以前老师在讲Java的时候,一定讲过这样一个机制,叫什么Java的,Java的动态绑定机制,我们把这个动态绑定机制的规则拿出来,Java的动态绑定机制的一个。
18:05
小结。第一点。低。第一点,如果我们去调,如果调的是一个对象。啊,如果如果调用的是对象,调用的是,诶调用的是方法则。则JVMGJVMG会。前面一句会将会将该方法,该方法和对象的内存地址绑定。内存地址。绑定,即你这个对象到底是谁,我这个方法就调谁的是不是好,这是第一个,第二个如果我们调用的是一个属性,在Java中如果调用的是一个属性,则没有,没有动态绑定机制。绑定机制,那就会怎么样呢?就说是哪个就在哪里访问,就是在哪里调用,在哪里调用。
19:07
就。就返回对应的值。对应的值,那么同学们知道这个原则过后呢?现在我们就很清晰了。同学们看,现在我们就很清晰了,就说此时此刻你在这个地方,因为你把这个sum去掉了,它在调的时候呢,这个时候它掉的是这个sum,其实到他在调这个上的时候啊,他在调这个上的时候呢,他。他在这方调的时候其实已经知道哦,我现在是调它这个get I。这个get I呢,因为你在这调get I的时候,你这个对象呢,是调方法,调方法它就会这个内存地址绑定,绑定的话,你这是呃是BB,所以说这个II呢,它调的其实是下面这个II调用这个get I过后呢,返回的I,这个I呢,又不是动态绑定的,它就返回这个20,所以说整个这个结果就是20加十。
20:09
下面的道理也是一样,好,把这个结论记住了,好,这就是一个重要结论。那么知道这个结论以后的好处是什么呢?下面我们就可以来看。是开了的。就我们有了这样一个结论过后啊,就是有了JVMG,它底层的这样一个运行机制以后呢,我们再去学习斯卡的这个字段的复写,我们就。非常轻松非常明白的搞定它的规则了。好,同学们,我先把刚才Java的这个回顾给大家,两个回顾给大家板述一下,我们再接着讲。好,老规矩,先板书一把,那刚才我们讲的是什么东西呢?刚才我们拿了一点时间来回顾了一下这个Java的,呃,关于Java的一个字段,复习的一些内容,好,先把它整理一下。
21:07
好,这个地方我们说的是复习字段。副业之段我讲了什么内容呢?各位朋友?首先呢,我做了一个基本介绍,这个介绍里边呢,我们说了撕开了可以改写子类的,称之为复写,我叫做重写。这是第一个,第二个呢,我们回顾了一下,我们回顾了一下Java中的这个属性的重写,我这说了方法有重写,但属性没有重写,没有属性或者字段重写,只准确的讲叫隐藏字段代替了重写,这是Java的规则。啊,这边还有一个文档,我把这个文档呢,也给同学们分享到这里啊,这边我有个文档,我给大家复制过来。这个放到这儿呢,同学们以后可以看到啊,你双击就可以打开。就是word文档,它有这个功能什么呢?你粘贴一个这幅文件,双击再打开,里面的内容就就在这儿,所以说你看起来好像是个图片,其实它是一个什么呢?它是一个文件。
22:09
对吧,好好,然后呢,我们又说了一下什么呢,我们又说了一下Java的另外一个重要特性叫动态绑定机制。那这个动态绑定机制的它的规则先把它说到这里啊,动态绑定。动态绑定。绑定的一个机制,它是什么机制呢?先给同学们写到这儿,就是这个机制。OK,这一点其实是很重要的。好,我把它整理到这,然后把代码给大家拿过来。一个是这个,一个是这个好,有了这两个原则过后,我们再来看看呢,你就一下就了了解了。我把这个呢给大家板书到笔记中去。对。OK,好,关于Java的复写字段的回顾啊,包括它的一个动态机制的回顾呢,我们就先说到这儿。
我来说两句