00:00
大家好,我是海波老师,前面讲了方法的重载啊,为了让大家加深印象,这里我们给大家问几个小问题,让大家回答一下,我们这里呢,来拷贝代码来复制,然后呢改成我们的幺四,然后写个下划线一就可以了,然后呢点击OK,点击完成以后把这个全都去掉。前面讲了咱们的所谓方法的重载呢,就是方法名相同,然后呢,我的参数列表不相同,什么叫参数列表不相同啊,就是个数顺序和它的类型对吧?而且咱们前面还讲了咱们的构造方法是不是也存在方法的重载啊,这个咱们之前都是讲过的啊,现在我们来给大家讲一下,我写上一个类,咱们叫做class,然后呢,我写上一个UR啊,写上一个幺四,再写个幺啊放过来,放过来以后我现在比方说呀,我现在有多个我们的构造方法,所以U的141写个括号,然后放过来,放过来以后我下面的141我们再来啊,141写个括号,然后呢,我这里给它写上一个叫做string,我叫做name,大家会发现我们方法名是一样的,但是我们的这个参数列表是不一样的吧,同样道理,我这写上它,我们叫做幺四啊幺,然后写个括号,我这里呢,给它准备两个参数,我们写上它叫做name,再来一个逗号,我再写上一个我们的性别,诶可以了,那我这么写完了以后,我在当前。
01:19
的这个位置啊,我就写上U141,它等于U1等于new u141,好了,我写完了以后,同学们记住,我当前有三个构造方法,但是你由于啊没有传任何的参数,所以它就能找到我无参的构造方法,没问题吧?诶,那我再来一个对象,我写上一个二,这个时候呢,我就要传一个参数了,所以我就写上它,我们叫做张三,好,那我写完了以后干嘛呢?我再来一个,我来一个以后我写上一个三,然后呢,我要传两个参数,所以呢,张三,我再写上一个,诶,我们的性别,我们的男,我这么写上,大家会发现我现在三个方法就分别调用了。同学们,我们三个对象就已经创建好了,但是你要注意啊,我们现在的这三个方法呀,它会传不同的参数,但是呢,有的时候我感觉太麻烦,为什么呢?你这里写了一大堆的参数,我要一个一个传太麻烦,我就想用最简单的方式,我不传任何的参数,能不能也把这些值给它设定上呢?哎,其实也是可以的,只不过这个时候啊,我们的这些值啊,就是默认的了,也就意味着我现在希望呢,当我调用这个无参的构造方法的时候,他会来帮我调用这个有参的构造方法怎么办?
02:32
所以同学们,我们说一下来,所以我们这里写上,如果在一个我们的构造方法中,它想要调用。其他的构造方法,那么它需要使用关键字,这个关键字啊,咱们之前给大家讲过,叫做this。就是用它,还记得咱们之前给大家讲那个负类的构造方法吗?咱们是不是用到了一个叫做super啊,那个super呢,可以调用负类的构造方法,而我们这里呢,是用我们的this,什么意思啊,大家会发现这个叫无参的构造方法吧,你写上一个叫做this,然后呢,写个括号,你这么写了以后,就表示你要调用自己的构造方法,只不过自己的构造方法呀,你自己调自己没有意义啊,对吧,怎么办?诶传个参数,所以呢,我这里就写上它,我叫做张三。
03:22
我这么写叫做张三,你这么写就跟我直接这么写没有任何的区别,为什么呢?是因为我帮你把张三传过去了,同样道理啊,我们的这个张三也可以,干嘛呢?我写上一个叫this,然后写个括号,我把这个name呀给我传进来,什么意思?你不是把张三传进来了吗?好,张三我传进去,但是我还想把性别传进去,接下来呢,我就写上第二个参数,我们写上我们叫做男。好了,写完之后,同学们你会发现我现在这么写跟刚才这么写是没有任何区别的,也就意味着如果你把这个注掉。我这么写它,就等同于把我们这两个值传进去了,来验证一遍,我们这里写上它,我们叫做点。
04:06
然后呢,名称有了,再写上哎,我们的逗号,再加上一个性别就可以了,好了,同学们,我们试一试啊,运行一下,看结果运行运行以后你会发现我们当前的张三和南就全都有了,为什么有啊,执行顺序。我这里调用了new的构造方法之后,它会执行无参的构造方法,然后呢,他会用特殊的关键字历史,然后呢,把张三传过去,来调用他的一个参数的这个构造方法,那么在这里呢,他把你得到的名称传给了另外一个构造方法,然后呢,额外加了一个性别男,那么他就会走到这个构造方法,走过来以后,那么名称就是张三,性别就是男,所以没有任何的问题。同学们,这就是我们之前方法重载的一个小细节,只不过它体现在了我们的构造方法当中。好了,这里为了给大家演示方法的重载,我们再给大家创建一个程序,来我们这里拷贝。拷贝以后呢,我们写上它写个二,然后点击OK,点击OK以后把它我就不要了,然后呢,把它写个一个二就可以了,把这个去掉,去掉以后啊,我们现在呢,给大家写一个叫static,然后呢word我写个test。
05:14
写上它,我们叫做bite,然后写个B在里面呢,我打印一下,咱们就写上B就可以了,好,接下来sta word再写个test,然后呢,我们再写上它,我们叫做thought。好,给个S,然后呢,我们打印一下,咱们就写上它,我们叫我们就写上S就可以了,接下来以此类推,写上它叫Y,我们写上一个test,然后括号,然后呢把这里呢我写上一个叫叉,然后写个C,然后呢,我这里呢给它来,我们写上CCC就可以了,最后呢,我再来一个啊来Y,我叫test,然后我写上一个咱们的int I。哎,然后打印一下,咱们这里就写上它,咱们叫iii就可以了,哎,我为什么这么写啊,首先同学们记住了,方法名相同,但是参数列表不相同吧,那么现在我们这里的参数列表它就不相同,为什么呢?类型不一样嘛,好,类型不一样说明他们是四个不同的方法,那我现在呢,我准备一个叫bit,然后呢,我写上一个B,它等于十,那么接下来呢,我们这里呢,就给它来test一下,然后写上一个B。
06:20
我想问同学们的就是我当前打印的结果是B呢,还是S呢?还是C呢?还是I呢?同学们想一想。如果是你们的话,你们觉得当前的结果是什么?我相信啊,这个大家很容易能想到,为什么呢?因为啊,你这里传了一个BY,诶我们这里不也是BYT嘛,对不对,所以说他们俩就应该匹配上了吗?你匹配上了以后,你这个是我们的十给这个BAT,那我直行它不就打印bbb吗?所以我们来验证一下运行,运行以后你看结果,你会发现它的结果确实是B。其实啊,有的时候呢,我们可以换一种方式来考虑,大家看一下我们当前我们idea当中给我们的四个方法中,这个是灰色吧,这个是不是黑色呀,什么意思?灰色就表示当前没用上,而我的test呢就用上了,你看我通过这种方式不也能够大概的判断一下吗?当然了,这只是一种技巧啊,再给大家讲一下,我们写代码可不能说看这个技巧对不对,就是我们有的时候呢,为了方便我们去用这样的技巧啊,但是我们真正的是要搞懂它的一些原理性的东西,所以呢,我们把这个给他往后推。
07:30
好,同学们,那现在呢,我的这个方法呢,我先给它注掉,也就意味着我们当前打印的是bbb没问题,那好,我现在呢,把咱们的这个test这样给它注掉,同学们,我问同学们这个时候如果我放开这个注释的话,你们觉得它应该打印什么呢?或者说他会不会报错呢?大家想一想,什么意思啊,你是BYT,我这里没有BYT呀,你没有BYT的话,那是不是就报错了呢,对不对?那好,如果他要不报数,他可能会走哪一个,大家想想,这就是我们提出的问题。
08:05
这个大家想想能不能想明白,所以啊,我们这里呢,把它拿过来,把它给它放开,别放开了,我再写一个吧,咱们叫test b,首先大家看一下我们的这个地方报错了吗?没有,如果没报错,是不是就意味着我们当前程序是可以正确执行的?诶,可是我就不明白了,什么呢?它到底打印的是我的short的S呢?还是我的char的C呢?还是我们int类型的I呢?我就分不清了,为啥呢?没有bit呀?哦,老师,那我明白了,是不是应该打印那个int呀。所以有的同学可能就会说了,老师,我打印那个叫iii,为什么呢?因为啊,我们讲过我们的数值类型,默认值不就是int吗?也就意味着你的十不是个int吗?只不过它在我们bet范围之内是有效的,所以呢,是个bitt,但是如果没有BAT的话,它不就是个int值吗?所以呢,把它当成int值传过去不就没问题了吗?所以啊,我相信有的同学可能会这么想,那对不对呢?咱们来验证一下,所以我运行,运行以后看结果,你会发现我们的结果并不是int,而是什么short中的S。
09:10
哎,老师这是为什么呢?这里就是给大家解释一下了,咱们前面给大家讲基本数据类型,我们讲过什么呢?我们的bit呀,它其实是我的八位。它是一个字节,是八位吧,而我们的shortt呢,是什么呢?它是我们的两个字节,16位,没错吧,然后呢,我们的那个叉,它是两个字节,它也是16位,而我们的int呢,它是我们四个字节,我们的32位,所以说你会发现我们的bit sot char和int,它是一个从小到大的这么一个顺序,哎,老师,这个跟咱们当前有什么关系没有呢?有啊,是因为我当前的bit呀,它是个十,没有问题。可是呢,我没有找到它对应的方法,那怎么办?我这时候会扩大数据类型,什么意思?同学们再给大家解释一下,我们的程序啊,可以在数值不变的情况下来扩大精度,所以这里我们说一下我们的基本数据类型,在匹配方法时,在匹配方法时可以在数值不变的情况下。
10:17
扩大我们数据的精度。什么叫精度啊,就是你的位数嘛,你的位数越多,你的精度越大嘛,对不对,我们当前说了你的bit是十对不对?好,你是八位,但是没有啊怎么办?没有的话可以在数值不变,什么叫数值不变就还是十的情况下把精度扩大,诶把八变成16,你看看这不就行了吗?诶老师,那为什么不是变成12啊,那你想啊,你从八变成16容易还是变成32容易,那肯定变成16容易吗?所以我们当前的结果是我的shot这个其实是对的,哎,所以这个没有问题啊,好,我们来看看这里确实就是我的sort就是这样。好了,那我接下来把这个蛀掉,我蛀掉以后同学们,我再问问同学们,那如果当前我的short他也没有怎么办,也就意味着我当前的这个short也被我蛀掉了。
11:08
做掉了以后,你们觉得当前会出现一个什么情况,还是走这个差呢,还是走int呢?哦老师我知道了,你前面不讲了吗?我们当前的这个数值不变,要扩大精度,那我的八到16不就完事了吗?所以它里面会打印什么我的C,咱们就差嘛,咱们就C了,咱们试一试啊,把这个来给它打开,打开以后我来运行一下,运行运行以后看结果啊,你会发现,诶老师不对呀,它为什么是我们的I呢?诶,怎么不是那个叉呢?这里给大家解释一下,也很简单,因为我的叉虽然是16位,但是它无法跟BAT做转换,所以咱们这里再说一下我们的BAT类型,它是无法和差类型。做转换的。你确实呀,你的差是16倍,我的bed是八倍,但是我不能扩大精度变成你,为什么呢?因为咱们无法做转换,诶为什么?就是因为我们的差它是没有负数的,咱们的它没有复数,但是我们的bit它存在负数。
12:13
所以基于这种情况的话,我们的BA的负数,你说怎么转成差吧,这个就转不了,同学们能不能明白老师说的意思?所以啊,也就意味着我们的这个差转不了,那他转不了的话,那不就只能再提升我的精度变成32位吗?这个大家能不能明白,如果能明白,那所以打印我们的爱就顺理成章了。好,那说到这儿了,我相信大家已经有点感觉了吧,那其实就不用说了,我现在如果把这个要蛀掉的话怎么办?你注掉的话就肯定程序报错了,为什么?因为我当前的BAT是转不了我们的差类型,所以它就传不进去,这个大家能不能明白?诶,就是这个道理,同样道理啊,如果你再加个什么浪啊,Float double,诶跟刚才的这个理论和这个原理没有任何的区别,这个就需要大家自己下来试一试,再理解理解了啊,方法的重载有很多的细节需要大家注意,好了,我们再给大家演示个例子啊,咱们把这个做掉。
13:12
好,我们这里呢,把它关掉我们再来啊,刚才给大家演示的呢,是我们的基本数据类型,我们接下来给大家演示一下,引用数据类型,点击OK,点击OK以后把这个去掉型。去掉以后,下面这些东西啊,咱们也都不要了,把这个全去掉啊去掉。去掉了以后呢,我们现在呢,写上一个class,嗯,为了简单,我的起名就AAA,就这么起名了啊好,然后呢,放过来,我再写个class,我们叫做bbb,然后呢,我继承我的AAA,我这么写,同学们,我写完以后,现在呢我们在这里来。我们叫做什么呢?我们叫做static,然后呢,写个word。写上一个word,写个test写完了之后啊,同学们,我们需要注意了,我这里呢,就给它一个AAA,然后呢,AAA行了,然后呢,我在这里呢,我就打印一下咱们的这个叫做AAA就可以了,同样道理呢,我拷贝一下,把这个呢,我改成我们的bbb。
14:08
Bbb,然后呢,它改成BB行,这个也改成bbb好了,那我写完以后,同学们,我现在啊,就准备写上它了,我们这里写上AAA,然后呢,我们AAA,它等于new,咱们叫AAA,好,写完之后同学们,我现在写个test,我写上一个AAA,现在它会打印什么内容呢?我相信啊,大家如果有技巧的话,你会发现当前的这个test已经变成黑色了吧,这个是灰色,是不是就意味着肯定是我当前的这个方法执行啊,这个是有道理的,为什么?因为你就是一个A的对象啊,所以我这里是个A,没有任何的问题,对不对,所以咱们执行一下运行。运行以后大家会发现我这里A没问题吧,那如果我当前的A是没问题的话,同学们注意了,我现在把这个往后啊,不让大家看见啊,把它去掉。好,去掉以后,我现在把我的代码呢,变一下,把这个注掉,注掉了以后把这个改成bbb,诶同学们,你们觉得现在会答应什么。
15:10
诶老师那这简单呀,你当前是B对象,那你打印的肯定是B呀,对不对,所以呢,我们现在运行一下看结果。同学们答案是B吧,哎,所以呢,我们会发现我们好像理解了当前的这个实用,但是同学们你们要注意了,我现在的问题才真正的出来了,什么呢?我们再写一段代码,我这里呢,把它改一下,我们叫做AAA,我问同学们,我现在如果执行的话,它的打印结果应该是什么?大家想一想,记住这个可就不简单了,为什么?因为我这个是一种特殊的语法,我们叫做多肽,对吧?咱们是不是讲过一个对象在不同场景下所表现的不同的形态和状态吧,对不对?我们的所谓的多态就约束了我们当前的应用场景,我们当前的B是不是就当成我的A对象来用啊?那么这个时候我问同学们,它应该会打印什么呢?
16:04
是打印A还是打印B?这个大家想一想,记住啊,这个得想一想,我们一定要明白语法是怎么去应用的,对吧,你不能光讲语法,你得知道怎么去用啊,好了,同学们,我们先给大家解释一下,首先我们有几个点需要解释,第一个。我们所谓的这个多肽。多肽它其实就是约束了我们对象的使用场景,这个大家还记得吧,没有任何问题,对不对,就意味着我给你了一个B对象,但是你会当成A来用,没错吧,这是我的第一个问题,这个是我们第一个要说的,我们第二个要说的东西是什么呢?就是我们方法的重载,怎么叫做方的重载,就是方法名相同,方法名相同吧,还有就是参数列表,咱们叫不同。怎么体验不同啊,我们叫做个数。对吧,还有一个叫做顺序,还有一个叫做类型,只要你保证这三点了,那么好,它就叫方法的重载,对吧?行,咱们一个一个来说,我们这个不就叫多肽吗?我们下面的两个方法不就叫重载吗?好结合在一块儿,大家想一个问题,什么问题啊,我们当前方法的重载,大家想想它们个数相不相同,相同吧,个数相同都是一个,所以这个你不用考虑,那我问你它们顺序呢?
17:22
你就一个参数有什么顺序可言的对不对,你就一个参数就没有顺序可言了,诶那好了,那还剩下一个叫类型啊,所以我们怎么区分这两个方法,不就看它的类型吗?对不对?好,如果是看类型的话,咱们前面又咱们前面又说了,我们多肽就是把当前的对象在当前的A的场景中去使用,就意味着它的类型不就是A吗?大家想想,我们的结果是不是就应该是A呀,这个大家能不能明白?哎,我们的A,所以同学们注意了,我们真正去调用哪一个方法,它取决于我们当前的这个参数列表,以及你使用对象当中的这个类型,可不是你的内存当中除了什么对象,而是你当前使用它的场景,很简单,在这个场景当中你用到了什么样的功能,没错吧,同学们现在这个问题能不能够明白了,如果这个大家能明白的话,咱把问题呢,咱们稍微的再换一换啊,来把这个关掉。
18:24
关掉了以后大家看一下啊,来我们这里呢,有A有B吧,那好同学们,我们现在呢,把这个A对象给它注掉,同学们你们觉得会怎么办呢?哦,老师,那A对象没了,那不就B对象了吗?所以呢,这个时候把它注掉,注掉以后你会发现根本就跑不通,你会发现直接就报错了。诶,老师不对呀,我们这里有B类型的方法呀,为什么还报错呢?这是因为我们使用的场景是什么,我们的A,可是你没有A的这个类型,那怎么办呀。诶给大家讲一下,其实啊,如果没有的话,原则上也可以,只不过呢,跟咱们前面讲的那个基本类型就不一样了,我们之前讲的基本数据类型啊,它有提升精度的概念,但是我们的引用数据类型就没有提升精度的概念了,它提升的是它的类型的级别,也就意味着它会往它的上一级去找,什么意思呢?大家看一下来,咱们找一下我们的AA,它会找这样的一个方法,如果找不到他会怎么办呢?会往它的副类去找,就意味着他会找到他的object。
19:29
这个大家能不能明白,哎,会这么去找,但是你这没有啊,你这没有不就报错了吗?就是这个道理,好,同学们为了验证这一点,我把这个改成叫bbb,如果你改成B与B以后,同学们你会发现没问题,为什么没问题?因为我们当前的这个B与B类型是匹配的,所以我把对象传进去,没有任何的问题,好,我把它注掉,注掉以后同学们我把这个打开,你会发现这个是没事的。诶,老师,为什么没问题,因为我现在是什么呢?有一个bbb啊,可是我找不到对应的方法怎么办?我会提升它数据的类型,找它的负类,所以它的负类不就是AAA吗?对吧?我的BB的负类不就是A吗?所以我就找到了AA的方法,这个没问题吧,同学们如果AA找不到怎么办?记住同学们,如果找不到,找它的负类叫object,你这么写其实也没事,这就意味着再往前找,就一层一层往前找,只要找到了它就能用了,你看我这不就能用了吗?所以啊,还是那句话,方法的重载有很多的小细节需要大家注意一下啊,行了,我们小练习就做到这里。
我来说两句