00:00
行了,同学们,那咱们就接着再往下吧,再往下的话就是关于super这块呢,是不是,哎,这是一个新的章节第14章啊,Super关键字。嗯,那么super关键字这块呢,咱们来看一下啊,这个最好最好和这个this呢,要对比着学啊,This对比着学。Super关键字啊。那么我在这里呢,给大家新建了一个新的章节啊,叫CHAPTER14啊第14章节啊,第14章节,然后呢,我把这个DOS命令窗口也切过来了啊切到这儿,那先来接下来看啊,首先第一个我们看super到底是个什么东西,好吧,啊,Super是个什么东西啊。来super test01。那有些东西可能需要记一下啊。Super。是一个关键字啊。关键字。
01:01
全部小写啊,这是第一点。第二点是super和this啊,对比着学习啊对比着学习。那么this这块呢,是什么呢?This只能出现在什么呀,静态,哎,只能出现在实例方法中。就是能出现在实例方法中。和静态啊,不是和这个构造方法中。是吧,This的语法是要么是this点。啊,要么你就是什么呀,This括号。是不是,然后this不能使用在哪呀,叫做静态方法中。我们先把这个理论上的一些东西啊,先给它拿出来,拿出来。它是一个关键词,是全部小写的super和this对比的学习啊,This这块是能出现在实例方法和静态方法,实例方法和静态方法中啊,语法是这点,还有这是括号。
02:10
This不能使用在静态方法当中啊,然后this点大部分情况下。可以什么呀,省略的。是不是,哎,这点什么时候不能省略呢。在区分什么局部变量和实例变量的时候。不能省略。State name是不是name name name,嗯,你看。是不是这个时候就不能省啊?对吧,哎,这个时候就不能走。这是this点,那么this括号呢?This括号只能出现在哪呀?构造方法第一行。
03:06
啊,通过当前的构造方法去调用什么,调用本类中其他的构造方法。目的是代码复用。各位啊,那么这个是我们对this的一个回顾。啊,对this的一个回顾,各位啊,再捋一下啊,This这块呢,出现在实例方法和构造方法中,语法是this点和this括号this不能使用在静态方法中this点,哎大部分情况下是可以省略的,This点什么时候不能省略呢?在区分局部变量和实例变量的时候不能省,就像这种情况,然后呢,我们这次括号只能出现构造方法第一行,通过当前的构造方法调用本类中其他的构造方法,目的是代码复用啊,那么我一个一个对比各位啊,一个一个对比来把它复制一下。
04:02
拿过来我们直接放哪啊,放到这,放到这个地方啊,首先super也一样,Super能出现在实例方法和构造方法中,Super它的语法我告诉大家也是有两种,一种是叫做super点,一个叫做super什么呀括号。还有super呢,也不能使用在什么呀,我们的静态方法当中,然后呢,Super点呢,哎,大部分情况下也是可以怎么着省略的啊,也是可以省略的,那么点什么时候不能省略呢?哎,这个呢,我给大家讲一讲,到时候啊,这里仍然是留有疑问的啊,留有疑问的。那么还有一个就是关于super括号的括号呢,只能出现的构造方法第一行通过当前构造方法去调用什么呀,负类。副类中的构造方法,副类中的构造方法目的也是什么呀,代码复用啊,也是代码复用一样的一样的啊,或者说目的是是什么呢?是创建子类对象之前先初始化副类型特征。
05:11
先初始化类型特征啊,其实这个模拟的是什么呀,在创建子类对象的时候,先创建类对象,你可以这样去理解啊。目的是创建子类对象的时候,先初始化父类型特征。这就是super啊。那么我是先把这个结论呢,先给大家放到这儿了,各位啊,先放到这了,那咱们一个一个去解决啊,一个去解决,我们来来看一下好吧,来看一下这个super啊。先把这个理论上的东西先拿过来,放到这儿吧。来public class,我们叫零一。Public static wildman。
06:05
我们现在在这儿呢,简单写一个啊class a,然后呢,再来一个class b呢,去继承这个A。各位啊,继承A,那么我们在这个地方呢,有一个什么呢?构造方法是无参构造是不是。无参构造啊,system.out print打印输出,我们叫A类的无参数构造方法。然后呢,再往下呢,这块B呢,我们也给一个什么呀,无参数的方法点out.line打印,我们输出什么呀,叫做。大家看一看啊,这叫B类的什么无参数构造方法对不对,那么接下来B是继承A的,那我在这拗一个B。就创建子类对象吧,创建子类对象,那么创建子类对象new的时候,我们创建这个D类型对象的时候,他一定会去调这个无参构造,对吧,那无参构造呢,它会输出这个内容是不是?哎,我们来测试一下,看它会输出什么好吧。
07:11
来Java c呢,我们编译super test01.java那我们编译之后呢,接下来Java去运行super什么呀,零一走好,大家看这个输出结果是怎样的呢?是这样的。说是A类的无参数构造方法执行,然后再输出B类的无参数构造方法执行,也就是说他先执行的是。这个对不对,然后再执行的他。哎,有没有发现一个这样的一个问题,你看。结果很有意思啊。对不对,哎,这个执行结果我给他贴过来啊,我们经过测试啊,是这样的。实际上是这个构造方法先执行。对不对,然后呢,再去执行这个构造方法是不是。
08:04
对吧,哎,其实这个模拟的是什么。模拟的是现实世界当中,要想有儿子,先得有父亲的概念啊,Super括号。表示什么呢?表示。通过子类的构造方法调用什么呀,父类的构造方法。啊,模拟现实世界中的这种场景啊,要想有儿子,需要先有父亲。啊,Super框,那我们来看一下,如果我们把这个注释掉,我们大家也知道之前讲过,一个类当中如果不提供任何构造方法,它默认会有一个无参构造,就是说你这注释掉了对吧,就是说一个类如果没有手动提供任何构造方法。
09:08
对吧,哎,系统会默认提供一个无参数构造方法。所以这个程序也不耽误你编译,也不耽误你运行,没有任何问题啊,只不过我们现在呢,只是这里输出了,因为上面没有代码嘛,对吧,那假如说我们还有一个规矩叫什么呀?哎,如果一个类如果提供了。如果手动啊提供了一个构造方法,那么无参数构造系统将不再提供,对吧?所以这个时候呢,假如说你写了个构造方法,你叭叭叭叭往这写,写的时候你E给它加了个参数,哎,妥了,你这个代码再编译就报错。你再编译就完了,你看。
10:01
为啥编译报错呀?为啥编译报错呀,第56行,56行说谁说这个呢。哎,因为呀,它这个构造方法呀。它在这个第一行上面,它有个super括号,而这个super括号呢,就是你什么也不写的情况下啊,就是这个位置你啥也不写的情况下,它实际上是有一个super括号,这是通过我们的构造方法去调用负类的什么呀,无参数构造方法,由于你负类现在有一个有参数的构造方法,你无参构造就没了,但是你这个。B这个类当中的构造方法的第一行是用super括号去调用的,所以这块呢,它会告诉你这有问题,你看。走。不行了吧,是不是无法将A中的构造器?A,是吧,应用到给定类型。他说需要一个印。他。找到没有参数,说第56行找的是没有参数,第56行这个大括号这个位置,这个大括号往后,这个大括号往后第56行。
11:09
大括号往后他找到的这个位置有一个什么。找到一个没有参数的。对吗?就是有的老师他为什么说规定啊,如果你各种方法第一行什么也没写,它会自动有一个S括号。明白吗?它会自动有一个super括号。但是后边说了,他说找到没有参数的哈。需要一个什么,也就是说这个位置它需要一个,那我们如果这样写的话,是不是就没问题了。这样写的话,它上面是不是就没有这个修括号,因为我说了,修括号只能跟this括号一样,也只能出现在构造方法第一行。只能出现在构造方向第一行啊。修括号如果是100的话,就相当于是通过子类的构造方法,是不是调用负类的构造方法调这个呀,它是不是就不调那个无参构造了,所以这样是不是就没问题了。
12:08
是吧,如果说你删掉的话,你这样就有问题。有什么问题啊?哎。我说了,当一个构造方法第一行什么也没有的时候。啊,它会自动加一个什么呀,Super无参数的一个。这样的一个构造方法的调用啊,这表示通过子类的构造方法去调用,父类的构造方法调的是无参的。而你复类现在没有无参构造,你如果有一个无参构造,你说你把这个放开了是吧,这个时候你编译你看就没问题了,你看。是不是,哎这块你去掉它它也是有啊,你去掉它它也是有。哎,你去掉它,它这块也有那个修括号啊,也有一个修括号,各位这个目的是为了要创建儿子,必须得先创建父亲是一个道理。就你删了,他也有听懂了吧,来。
13:01
好了各位,那这块呢,你就报报报错呗,编译报错你看。是吧,因为你这个构造方法在执行的时候,这个第一行这它默认会有super括号,而super括号失去会调用负类的无参构造,负类当中又没有无参数构造法,因为你有一个有参的,要么你把这个删了,你把这个删掉,那没问题呀,是不是你这个程序就完美了,那你就可以啊,没问题,因为你要不写它有一个午餐构造,所以你看这个程序再走,你看就没问题。是吧,所以我们之前一直在跟大家聊的一件事,就是什么建议大家把什么把无参构造怎么着手动的给它给给它干啥写出来,手动的把无餐构造方方法写出来的,目的就是为了防止我们今天这个错误,你看现在就没有问题了,就没有问题了啊,就是建议啊,建议手动的将一个类的无参数构造方法写出来。啊,这里有一个很重要的一个结论。
14:03
重要的结论啊,这个结论是什么?就当一个构造方法第一行。既没有this括号,又没有super括号的话。不是有没有啊,是又。既没有this括号,又没有super括号的话,默认会有一个。Super括号。啊,表示通过当前子类的构造方法调用什么呀,父类的无参数构造方法。所以必须保证负类的无参数构造方法是存在的。
15:00
当一个构造方法第一行既没有this括号又没有super括号的话,默认会有个super括号啊。就这块儿是有个super括号的,就你不写也行,你写上也行啊,他都有。明白吗?编译你看在运行是不是super test01,你看A类的无参数构造方执行吧。是不是这个输出啦,然后紧接着是不是这个输出了,你拗的是不是这个B呀。调的是不是各种方法呀,好,你看输入什么呀,A,再输入B,那如果我把super括号给它放开呢。我们来看看Java c呢,我们再编译Java,再去运行,跟上面的结果是啊,一样的一模一样的,就是你写跟不写它都有,它都有,有的老师我不太明白啊,就是为啥是既没有Z括号又没有super括号的话。来,我问大家个问题。如果说我现在在我的这个构造方法第一行有一个SUPER123的话,大家想一想这边还有没有super括号啊,是不是就没有这个super括号了。
16:19
这是不是调用什么呀?这是什么意思?调用负类中有参数的构造方法吧。你走的是不是就这个了?system.outline打印输出。叫A类的什么?有参数构造方法,哪个参数啊,Int这个参数。我们来看这一次他是怎么走的,好吧,因为你还是你有一个B呀,还掉的是这个呀,那会执行这个吧,这个是不是就执行这个呀,对吧,因为你123是不是传给L了,就执行了呗,是不是,哎,然后再执行这个吧,来接下来看看啊,Java c呢,我们去编译Java去运行。
17:01
好的,A类的有参数构造方法执行吧,然后B类的无参构造法执行吧。是不是,哎,这有这么一个东西啊,那你这一块还能不能再加一个super括号啊。来,我们试一下,编一下就会报错。包括说对super调用必须是构造器中第一个语句,这句话似乎大家呢,应该是比较熟悉,之前因为我们讲this括号的时候,好像类似的一个问题就出现过,对吧?对super调用必须是构造系中第一个语句。就你这块已经有这个super括号的话,那这个super括号就没有了。这说话说的有点别扭哈,如果这有super括号,那下面,哎,反正这个东西啊,怎么说你你理解理解啊,如果什么也不写,那是有一个super括号无参的啊来编译一下我们再运行。你看对吧,如果你把这个放开,它将调的是这个的方法,就不再调这个了啊来再编译啊,再运行,我们先把这个现象先学了,先测试一下啊,先测试一下,你看就变成这样了。
18:10
是不是好,那你看我这里怎么怎么解释,我说既没有this括号,又没有super括号的话,来看好了啊,Public b在这呢,还有一个构造方法,这个构造方法呢,是一个int,比如说这个string类型的name吧,我随便写的啊呃,这个string类型name的system.out print line打印输出,我叫B类的什么有参数构造方法,参数的类型是什么呀?是string。那么接下来我这个代码这么写的,各位,我通过我这个无参构造去调,你这个有参数构造方法,我在这里我写了一个什么this括号,张三this括号,假如说我写上张三的话,那么这个字符串是不是正好和它匹配上啊?对吧,是不是和它匹配上啊,那就执行这个构造方法吧,那前面还能有super括号吗?
19:02
这边还有修复括号吗?因为之前说过this括号怎么着,各位还记得吗?This括是不是也只能出现了构造上第一行?Super是不是也只能出现在第一行?那我们来编译一下,大家看。说对this的调用必须是构造其中第一个语句。对吧,那如果说把这个放到上面呢,它放到下呢,我们再来看。对super的调用必须是构造器的第一个语句。我的天难住了,所以通过这里你可以得出一个什么结论,就是this括号跟括号不能共存。注意啊,就是这个this括号和super括号不能共存。他们都是只能出现在构造方法第一行。
20:00
明白吗?如果如果是这样的话,大家看我上面这个结论是不是对了,说既没有这次括号,又没有super括号的话,会默认有个super括号,这句话是不是就可以理解了?对吧,你你好好想想。就既啥也没写,就有一个什么呀,Super括号,但但凡你写了一个super括号,有参数的。哎,妥了,我这个就没了,明白吗?或者说但凡是你写了一个this括号在这里。那妥了啊妥了,那super括号也就怎么着,哎,没了,就是说这个这个构造方法,第一行什么时候会存在super括号,就是第一行既没有this括号,又没有super括号的时候,它默认会有super括号,这有有一个这样的重要结论。啊,另外this括号和super括号不能共存,都是只能出现构造法第一行,它如果是this括号呢,就代表通过当前构造方法去调用本类中的其他构造方法,如果是super括号的话,就表示通过我子类的构造方法去调用我父类的构造方法。其实通过我子类构造方法去调用父类构造方的目的是什么呢?目的是为了就是什么呢?就是说模拟我们现实世界,要想有儿子这个对象,必须得先把父亲造出来,就这个意思。
21:16
啊,就这意思啊,是你可以这样去理解,可以这样去理解。啊,那么这块呢,我们看看啊,大家思考一下。这个super括号是不是必然会有,你这个里边没有,这个里边会有吗?好好想想。你看你这里虽然没有这个super括号,你看看啊,你你也没了对吧,你是通过这个构造方法去调到这个构造方法对吗?你这个构造方法第一行是不是啥也没有啊,所以你这边是不是有个super括号啊。只有this括号是运行一下只有this括号。只有this括号的话,那你你这个还你你你推就能推出来,你不用那个啥了,你你就直接这边调的是谁呀,他呀他会调谁,他呀,他这边会先调super括号啊,你super括号实际上是先执行谁呀,我们这个呀,对吧?其实你这个构造方第一行也没有,啥也没有,这有个super括号,你知道吧,这个super号调的谁,调的是object里边的构造方法,我不知道大家有没有去理解这个事儿啊,实际上这个构造号第一行啥也没有,这里也是有的呀,这里也是默认有这一行代码的,你没有去深入的去想,各位啊,如果你说你调这个勾造方,这个勾通方第一行,如果啥也没有,这里也有一个super括号的,这个super括号其实是掉的什么呀,我们object里边的构造方法。
22:42
啊构造方法,所以如果说你要调B类的this括号的话,我们捋一下啊,那你会执行这个对吧,这个会执行super括号吧,Super括号会输出这个是不是,所以这个是不是先输出A类的无参构造方先先输出是吧,输出之后紧接着输出谁呀。
23:02
紧接着输入谁,各位是不是就输入这个呀。对吧,因为这个执行结束了呀,该说说他了,B的有参数都方向执行。啊,你掉的是他吗?是不是好,它对应的是这个方法,紧接着是不是它执行啊,所以它的执行顺序是什么?是this括号,张三过来之后呢,是super括号,Super括号是先执行我们A类的参数构造方输出这个结果,然后紧接着呢又输出这个结果,然后呢,这个执行构造化结束之后呢,再进行往下就是这个这个了,就是B类的无参构造执行了,先是A类的无参构造执行,再是B类的有参数构造方执行,然后呢,紧接着是我们的B类的无参数构造方式执行啊所以你new b诶在这它就会经过三行代码来我们编译一下。编译之后呢,接下来我们Java运行super test01走。A类的无参数构造分执行,B类的有参数构造分执行和B类的无参构造分执行。
24:02
看见了吗?他为什么会,因为你调的这个呀,调到无参的呀,无参会走这个呀,这个就会走他呀,他会先走这个呀,这个这块会走谁呀,会走他呀,他这块输出完之后呢,这个就结束,结束再走他吗?他说之后这就结束了,这个结束之后代表这个结束了,这个结束之后输是他呗,是不是啊,所以无论是怎样负类的构造方法都会执行,哎,研表总结的非常好啊,非常好,就无论是怎样,无论是怎样啊类的构造方法一定是会执行的,就无论是怎样折腾。啊,折腾负类的构造方法是一定会执行的,而且是百分百的,百分百的,因为我说了,你要是第一行你是啥也没有误,它就会有一个默认的求括号,如果你有一个this括号呢,那对不起,Super括号也就没有了,This括号呢,会去调另外一个的法,另外一个方法,这边它肯定也会有一个什么呀,Super括号,总之它会掉。
25:05
会掉弗雷的。啊,那如果说你负类这一块。哎,有一个构造方法,那你构造方法这边其实还是会掉负类的构造方法。明白吗?哎,是这样一个情况啊,这样一个情况。
我来说两句