00:00
那下面呢,我们来接着上午的内容,继续来讲解我们的SC啊,我们接着看这个复写字段的第三,一个需要同学们注意的地方就是,如果我们的这个修饰符是VAR的,那么它也只能去重写另外一个抽象的VR。诶,这一点呢,请大家要注意啊,就说呃,大家可能会想是用VR去重写一个另外一个VR,它不是的,它是去重写另外一个抽象的VR属性,那么什么叫抽象的呃VR呢?我们先来看一个小案例。还是打开我们的这个呃,代码啊,还是打开我们这个代码,那么我们新建一个小文件。好,我们新建一个文件,这是我们的D啊,又一个细节,好还是啊,我们写到的scanner字段啊,字段的override override的details。
01:06
零三。零三,好的,我们来看一下啊,Override那单词写错了,呃,多了一个S,把这个S去掉。好,把这个名字改一下啊。Detail。好,我们来看一下这个案例。呃,那么比如说现在呢,我有这么一个,呃,这么一个类叫A03CLASS。A03。A03,那比如说现在呢,我们这里有一个呃,抽象的字段。先来看一下在A03中,在A03中。有有一个A,有一个什么呢?抽象的这个字段啊,也就是说我们说的属性。那首先我们看看什么叫做抽象的字段啊?何为抽象的字段呢?
02:05
及。就是。就是没有初始化的,没有初始化的这种这种字段或者是属性。诶,没有初始化的这个这东西,那么我直接给他写个例子,比如说我们通常情况下呢,呃,是这样写的。有一个name对吧,这个是最类型的,那么大家看到,当我们这样写完以后呢,这个属性是没有赋值的,可是他不让你通过。他不让你通过,因为在我们SC里面呢,它是要求我们是有一个默认值的,你可以用这个下划线来指定,对吧,默认的你也可以直接写一个,呃,比如说指定的一个字串也可以,但是呢,你不能不写。那如果说你你这个地方没有初始化,它就是抽象的,这个就是抽象的,那如果你是抽象的这种字段呢,要求你的这个类也是抽象的类,那怎么办呢?Abstract。
03:09
这样子。啊,这样子就是这这就没问题了,那么第二个我们刚才说了抽象字段,那现在我们来看第二个啊,这个第二个呢,就是说抽象字段呢,它是需要把这个类也标记为抽象类啊对对对对,就说这时需要当当一个类有什么呢?就含有抽象。诶含有什么呢?含有抽象属性时,属性时则该类该类需要需要标记为啊,标志为也可以啊,标记标记为abstract。这是第二个,第三点我们要说一下,第三点要说一下,就是对于这种抽象的属性呢,它在底层并不会声明这个属性,而是生成了两个抽象的方法,注意听啊,对于。
04:08
对于抽象的属性,属性在底层,在底层不会不会生成对应的属性声明。而是,而是生成了,而是生成了两个对应的抽象方法,抽象方法什么方法呢?这个大家应该能够猜的出来,就是abstract,就是这个方法啊,一就是一个,嗯,两个抽象方法,哪两个抽分抽象方法我写到这就可以了,一个是name。一个是name,呃,下划线,呃,Dollar EQ,但是这两个方法是抽象方法,那么我们来先来运行一下,看看是不是这个道理啊,是不是这个道理,来,我们先运行一下。好,我这边写个hello,我们运行一把。
05:01
啊,运行啊让一下,诶现在呢,我这没有跑起来啊,因为这地方我写的是class,这个要改一下啊OK。找微信。运行,那么运行完了后呢,我们来看一下这个地方代码,这没毛病,打开我们的反编译工具,我们来看一下这一个A03。大家看一下A03。哦,就是他。打开它我们一楼哦,同学们可以看到,的确这样子的,你看。在这个地方呢,并没有看到一个name的name的属性,而是对应的两个抽象的方法。诶,那说说白了,也就是说,当我们这样做一个抽象的这个呃属性过后呢,其实你看到好些写一个属性其实没有,那这时候我们要去,呃要去重写它,要去要去重写它,就是我这写的这句话吗,就是VR只能重写这个抽象的,那你如果说老师,那如果他不是一个抽象的VR属性可不可以呢?不能不能重写,不能重写啊,我们现在把这个代码写到这里啊,说现在呢,我有一个sub。
06:08
Sub a03,我就这样写啊,A03。A03。好了。同学们可以看啊,现在我写到这,他马上就报错了,那报错的原因同学们应该知道。就是报了这么一个错误。对吧,那这个时候我们怎么办呢?两个办法,第一种方式,你把光标定在这,然后输入alt加回车键,它会提示你要实现这个方法,看到没有,这是一种一种方式,要么第二种呢,就是你说我也不实现,我把我自己也生命成抽象的也可以,好,那现在我们显然呃不会这样干的,我们直接将起重写,大家看到这里我写个十骏。啊,然后呢,这门我们来初始化一下就了。啊,这个时候呢,同学们想哈,为什么这样就可以重写它呢,其实准确的讲啊,同学们准确的讲这个地方呢,呃,你可以注意听这句话啊。
07:06
注意听说明一下,说明第一点,如果,如果我们我们在子类中。啊,如果我们在子类中去去这个重写,重写父类的抽象属性。抽象属性,诶注意听抽象属性本质上本质本质上是什么呢?是实现了实现了那个抽象方法。是不是这个意思,因为你看起来好像是重写,其实你是实现了它的重现方法,因为在这个地方它会生成两个内,它会生成两个public方法,一个是呃内这个这个name方法,一个是它因此呢,在这里你可以写overright,你可以不写,因此。因此这里我们我们可以写override。
08:01
也可以不写。这个关键字也可以不写,也可以不写,那你看我这样没有写啊,那么我加一个,那大家看这个这方有有个向向向上写的,这叫implements,那你写上行不行呢?也可以你写个override,它也不报错。啊也报错,所以说它这个语法呢,这个地方它是支持你写overrightde,也可以不写,因为本质上它并不是,呃,像我们那种很标准的一种说,诶把它给重写了,其实准确的讲是实现,因此他在这个语法上呢,Scar设计者就说你可以带这个也可以不带啊,这两种你都可以选择,所以说你看这两种写法呢,不要去把它搞晕了啊好,我们再说一下。嗯,如果说你是一个实现了的同学们。那你呢,就不能这样写啊,同学们看,假如我们这有个age,哎,我们看一个H,这是一个int,那么我给他一个,比如说十吧。
09:02
给一个十,那给一个十的话呢,给一个十的话呢,同学们可以看到我在这里,我在这里想去重写这个VR的,你看行不行啊,同学们看。好,他已然报错,那报了一个什么错呢?他说variable age needs override,他说需要这个一个标识符,对吧,我们来写一个。啊,当我们这样写完了过后呢,好像没有报错对吧,没有报错,我们来执行一下啊,我们来执行一下看看行不行啊,如果行的话呢,就说明OK了,来运行一个。啊,运行一个看它是实际上好像可以,但实际上它会报错,他说什么呀,Variable cannot over write a me,他说你的这个变量不能够去override,一个MU就是可变的variable,它不允许,那么这个呢,你就把它作为一个语法的一个规则记住就行了,好吧,这样我也不去细讲它的这个原因了,大家记住这个东西就行了。有些语法现象呢,如果每一个都要去讲,为什么还特别的费时间?
10:15
啊,原因呢,大家可以自己去推导啊,就是说你这一方式变量我就不让去修改,也说你不要你记住就不要用VR去重写,另外VR你这个VR能够重写什么呢?就是重写这种抽象的属性,而且听起来是重写,本质上是实现没有办法啊,它这个语法这很很有意思,既支持overright也可以不写。好了,同学们,那么这个呢,就是我们的又一个细节,我把它写到这里来。好朋友们,我写到这,这是我们的第三一个需要大家注意的地方,好的,我标号第三。好,标号为三。啊,各位朋友放这了,那放到这里呢,我把代码给朋友们整理一下,就是刚才我们写的这一段代码好了。
11:06
写到这里了,大家一一看就知道老师说了什么事。好,紧接着呢,我们来看它的第,呃,刚才那个一个总结吧,啊,这里我总结了一下,抽象属性就是声明未声明,但是没有初始化的变量,就是抽象的属性,抽象属性在抽象类中。那么VR抽现,呃,VR重写抽象的VR属性小结,一个属性没有初始化,那么这个属性就是抽象属性,抽象属性再编译成自页码时,属性并不会声明,而是会自动生成抽象方法,所以必须声明为抽象类,就是刚才我们看到这个。就这个啊,你看起来好像你写了一个呃,Name,但实际上没有对应真正的声明。好,这是第二点,第三点,如果我们复写一个附类的抽象属性,那么override的关键词可以省略掉。原因是为什么呢?因为父类的抽象属性生成的抽象方法,因此因为呃因原因是负类的抽象属性生成的是抽象方法。
12:12
因此这里就不涉及到方法的重写概念,而是实现,因此override它可以省略,但是你写上呢,它也不报错啊,理理论上来说啊,应该写上不允许才是更合理的,但是呢,它保留了这个override大家也就接受了,有些语法呢,都是人写的嘛,你要每一个都去较真的话,那其实呃,那肯定是有问题的啊,就说你看再严谨的这种语语法都会有一些让我们感觉到很很不好理解的地方吧,毕竟这个编译器也是人写的,是人他在有些地方就不是那么完美,好,这个大家就要看开一点,比如说你你去做任何一件,你去交一个女朋友是吧,那他一定会有一些瑕疵,那你每个都要去,为什么对吧,那这个事就没法生活了,这事情好好,我把这个呢,就给大家整,整理到这里吧,啊整理到这里,好,同学们,我整理到这里。
13:08
好,那么刚才呢,我讲了一个抽象属性的概念。对,然后呢,我又整理了一下VAR抽这个重写VR属性的几个说明,第一点。弟弟。第二点。对吧,诶第三点,如果我们这样子三点大家有个印象。好了,这是复写字段的三个,呃,那么复写字段大家要了解的细节呢?就是这么三点。
我来说两句