00:00
那刚才呢,我们是对这个方法的重写呢,进行一个整体上的一个说明,那么具体呢,关于方法的重写都有哪些规则呢?我们下面呢,来展开的说明一下啊,这个呢叫第三点叫重写的一个规定。中结一个规定,前面的话呢,我们讲到方法重载的时候呢,提到叫两同一不同,然后呢,就是具体的关于这个重载,这个怎么理解呢?它叫一个重载,那么在重写这块的话呢,这个规定呢,其实也很多,也比较细,那我们这块呢,还是从一个方法的声明入手,方法的这个声明呢,我们再来回顾一下。首先涉及到叫权限修饰符,然后呢返回值类型方法名,然后呢一对小括号叫做行参列表,诶后边有一个方法体,注意呢,我们在这个重载当中呢,呃,重写当中,那肯定这个方法体呢是不一样的,方法体要一样了,那就根本就没有必要呢去进行一个重写了,对吧?这个应该很好理解。
01:03
那我们呢,就从这样的几个方面呢来谈一谈,怎么呢才能算构成子类呢方法对负类方法的一个重写。那讲这个之前呢,我们再来一个大家的一个约定俗成。什么叫约定速成呢?我们这时候呢,把这个子类,就是我们想重写父类中的这个方法,比如说呢,像这个student当中的这个E的方法,咱把它呢,称作叫重写的方法。啊,子类中的这个叫重写的方法,而这个父类当中呢,我们这个异的方法,比如说它呢,被我们子类呢重写了,把它呢,咱们称作叫被重写的方法。就是我们负类中的。叫被重写的方法,哎,下边的话呢,我们就这样来用了,OK,那么下边呢,我们来看一下具体这个细节都有哪些,首先呢是第一个,这呢也是我们必须要考虑到的子类重写的方法和父类被重写的方法,我们说他们二者的方法名和行参列表一定是相同的,我们先把这个点呢写上。
02:10
说子类重写的方法的。方法名和行餐列表。这个我们这样说,子类重写的方法的方法名和心电列表与父类被重写的。方法的,这个方法名和形态列表呢相同。这个呢,其实很好理解了。咱们在前面讲这个重载的时候呢,提过说我们如何呢去确定叫唯一的一个方法,或者说我们如何表明咱们调的就是某个确定的方法,当然提过呢,首先呢,我们先依赖于方法名。那又因为呢,同样方法名的呢,会有好多构成重载了,所以咱们还需要依赖于这个叫形态列表,所以说呢,我们方法名加形态列表才能够唯一的确定呢是某一个方法了,所以我们这时候呢,你想覆盖某一个方法啊,想重写某个方法,那也一定呢,保证他们二者的方法名和形态列表呢得一样。
03:13
那我这时候呢,就唯一定位你了,我就想覆盖你,就这个意思,好这个呢,清楚以后我们接着来看这个第二个点。除了这个方法名和新的列表之外呢,我们他看到其他这样的几个条件,首先一个呢叫权限修饰符,那我们就先来说一下这个叫权限修饰符的这个情况,那这里边儿呢,我们说子类重写的方法的。权限修饰符,它呢是可以比我们父类中的这个权限修饰符呢更大的,那我就这样写了,说此类重写方法的权限修饰符呢,叫不小于负类被重写的这个方法的权限修饰符,那先能理解这个叫不小于言I之意呢,就是可以跟负类中这个呢是相等的这样的一个情况啊好,那我们这块呢,去举个例子,在这个person当中。
04:02
Person当中呢,大家看到我们这是一个E的方法了,我这个权限呢用的是public,在咱们这个student当中呢,我这也用的是public,这是没有毛病的,当我们把这个public呢删掉的时候,大家看到这时候呢就报错了,那这个错误信息看一下。说呢,首先呢,你是想重写我们person中的it的方法,为什么他这时候识别是重写呢?因为咱们这时候呢,方法名和形态列表跟父类中的这个是一样的,这个编译器呢,就认为我们现在呢,想想试图呢进行一个覆盖操作,但是呢,发现我们此时E这个方法的这个这个权限修饰符呢更小了,它这块呢,就给我们报了个错误,叫cannot reduce the visibility啊of the就是你这个person中这个要继承的这个方法。说我们不能够降低这个可见性,那ya IG呢,就是你最起码应该跟这个副类中的这个权限呢是一样的,那因为咱负类呢已经是public了,所以我们这个student呢就没得选了,那你只能是写一个叫public了。
05:02
那这时候呢,你看它就是一个overweight叫重写,好,那如果我们把这个person当中这个权限呢,Public你看啊,我删掉了,保存一下,那么再回到我们这个student这块呢,大家会发现仍然呢是一个重写。啊,这就我们所谓的呢,说子类中这个权限呢,其实可以比父类,父类中这个权限呢,是可以更大的,当然了跟它相同也没有问题,这就我们说的这样的一个点。这个点的话呢,其实大家可以稍微形象一点去理解这个咱们这个呢,叫方法的重启或者叫覆盖了,大家呢,不知道早上有没有吃过这个路边这个煎饼果子,这个北方同学呢,可能吃的多一点啊,你可以这样去想,这个煎饼果子的话呢,这块是摊煎饼的这样的一个铁片是吧,然后呢,我们上面呢摊了一个饼,比如说呢,我先摊了一个这样的一个饼。然后呢,现在呢,我想再摊一个把它覆盖掉,那你显然呢,最起码得跟一开始摊那个饼呢得一样大,或者呢,你比它还大一点,这样的话呢,你才能够把刚才你第一个这个饼呢给它覆盖掉。那这个它的大小呢,大家可以呢,就斜象点理解为呢,叫权限修饰符,也就是说呢,我们想覆盖负类中的这个,那你权限呢,不能比它小,你比它大了,你才能够把它盖得住,最起码也得跟它相同,OK,这呢就叫权限修饰符的一个规定。
06:15
行,那这个记清楚以后的话呢,马上呢,我们又得说一个特殊情况。什么特殊情况呢?我们先把这个点写出来,叫子类呢,不能重写,父类中声明为叫private权限的方法。子类呢,不能重写,父类中生明为private权限的方法,言I之义呢,就是如果我们这个父类当中啊,有一个方法,它的权限呢比较小,小到呢,它是一个private的,比如说我这里写一个叫收方法。在这个售方法里边,我们写一句话,说呢,我是一个人。行,那这呢是咱们定的一个叫私有方法,接下来我把这个方法呢,整个CTRLC一下,我在咱们的这个student当中,我这呢也做一个声明。
07:09
声明好以后,那我把这个private呢,比如说权限呢,我还给你放大一点啊,改成一个public,说呢我是一个学生。行,那这呢我们就写好了,写好以后的话呢,大家也看到了这个方法名形态列表这都一样了,然后呢,我们这块呢,权限还更大了,但是呢,前面并没有这个三角符号,这时候呢,就不认为是一个重写了。就不认为是一个重写了,所以呢,我们说呢,就是父类中,如果你要是有一个叫私有权限的方法子类呢,就不能叫这个重写了,因为呢,它太小了,以至于说我们这个子类呢,根本就看不到它,所以你就无所谓说对它进行覆盖了,你都看不着嘛,就这样的一个意思。啊,这个大家去理解一下,那这个证明一下,就是虽然把这个规定说完以后呢,我们在试图呢去做一个证明,那证明的话呢,大家可以这样去理解啊,你看我在这个。
08:04
Person这里边我这有一个work方法,以它为例吧,这个work呢,咱们在student当中呢,我没有进行重写,那相当于呢,咱们用的还是负类中的这个work方法,在这个work方法当中,大家看我这时候呢,写一个授方法。相当于我们在work当中呢,来调这个受了行,那我们在这个测试的时候,在这个位置,这个为了方便起见,我这呢加上一个换行,方便大家来看。加个这个星,我们看这个星上面这个work方法,然后我们执行一下。OK,行,大家看我们执行这个work方法的时候呢,一方面呢,先出来一个说走路的距离呢是十公里,同时的话呢,咱们调了一下这个瘦方法,很显然这时候这个瘦方法呢,调的是咱们person当中的这个瘦,而不是咱们student当中的这个寿。啊,如果呢,认为是一个重写,那就相当于我们此类呢,会将负类中的这个收方码呢进行一个覆盖,就是这样的意思,也就是说呢,你看人家这个it啊,大家看我这个it呢,是父类中定义的子类呢,进行了一个重写。
09:10
那然后呢,我这儿放到这个work里了。大家看一下正常的这个重写应该是什么样子的?行这的就能看出来了,正常你要是一个重写是一个覆盖的话呢,我们这个当你去调这个重写的方法的时候呢,它一定执行的是子类种的,而我们这个受方法你发现还是父类中的,那说明呢,不认为咱们子类呢对父类中这个私有的方法呢进行了重写,所以这个呢,大家要记住。OK,这个呢,咱们就过了,这是关于呢叫权限修饰符的问题。那么只要你是不是private了,比它大一点的话呢,就是default了,咱们也说了这个it呢,这都算是叫重启了,所以只有这个private呢比较特殊,记住它。接着呢,我们说一下这个第三个点。第三个点呢,咱们按照这个顺序呢,就该说这个叫返回值类型。
10:02
这个返回值类型啊,还是比较特别的,这个事儿比较多,那咱们这块呢,就是具体的给他展开一下。返回值类型。那反应质类型这块呢,比较细了,咱们一个一个来说。首先我们提到,如果这个父类中这个方法呢,是一个VO的。父类中生明这个方法是个wide,那么此类呢,重写的方法呢,也只能是Y了。来先把这个呢说明一下,就是负类,负类这个被重写的这个方法的返回值类型是Y,则此类。这个重写的这个方法的返回值类型,那也只能是。就是相当于呢,他俩得一样,你是Y呢,我也得是Y的,这个呢不多说,没有啥可说的了,那么接下来来谈,那么就是如果这个负类的返回值类型它不是Y了,那就有一个具体的类型了,那这时候呢,子类呢,应该怎么规定呢?我们这样说说负类叫被重写的这个方法的。
11:16
返回值类型。类型是这个呢,举个例子是这个A类型吧。就是一个具体的类型了,那么则这个子类重写的方法的返回类型怎么着呢?反正类型我们说呢,是可以是。这个A类或A类的子类,A子类啊,就是这样的一个情况。哎,这个呢,大家理解一下,我们下面来做一个说明,比如说呢,此时我们再去声明一个方法,我叫做public法治类型呢,我写成个object叫infer这样一个方法。这个方法的具体方法体,我就不过多的先去牵扯这个方法体了,现在把它写成一个no啊,主要呢,我们来关注一下这个方法的声明,此时这个方法的反应类型呢,是object,我CC一下这个方法结构在我们student当中粘过来。
12:10
粘过来以后呢,很显然这时候呢,已经构成了一个重启了,但如果我们把这个object呢,改成string。也是可以的。也是可以的,就相当于呢,我们这时候呢,虽然返回值是个string,但你是个string呢,它其实也相当于就是一个object了,哎,就是这样一个意思啊,就是说对于这个反应质类型这块呢,我们可以是父类这个方法反应质类型的一个子类。嗯,就这样的一个情况,这个大家呢去理解一下。就是这样的一个问题。那么在这里边呢,其实我们已经算是说清楚了,但是呢,额外的给大家再去强调一下啊,再去强调一下这个子类父类,这个是针对于类来讲的,这个类的话呢,属于引用数据类型,那咱们知道呢,这个方法的返回值类型呢,除了引用数据类型之外呢,还可以是基本数据类型,那如果要是基本数据类型,那又怎么着呢。
13:04
这块我们是这样规定的,说父类被重写的方法的返回值类型,如果是呢,叫基本数据类型。如果是基本数列型,那么我们说则子类重写的方法的返回类型。必须是相同的这个基本数据类型。必须是相同基本数据类型,其实这块的话呢,咱们不说的话呢,这其实也算是描述了这个情况了,就是你你这个基本数据类型,它就无所谓此类了,那其实就要求你必须是这个A类了,其实是在这里边已经描述过了的,只是呢,只是呢,咱们又稍微的强调说一下,那也就意味着如果我们这个父类呢,这个方法的。反应质类型,比如说呢,我们这写成个double了。那就意味着呢,咱们这个子类,你重启的这个方法的返回类型呢,也必须是double。
14:00
比如说打,那你这儿呢,就是必须。也是。这个大。啊,就是这样的一个情况了。就是不能这样,不能大家不能这样去理解啊,说这个负类呢,是个double,这个我们前面讲过呢,叫自动类应提升,说呢子类这块呢,是不是可以写成个int呀,这是绝对不可以的,我们说呢,你int的一个值,比如说一,咱们可以付给一个double类型的变量。这个事大家要清楚,咱们一个一呢,可以赋给一个double型的变量,这是没有毛病的,这叫自动类型提升,但是我们不能认为呢,说这个一代表的是一个int类型,说int这个类型是double类型的一个子类,这是错误的。这是错误的,这两个类呢,是严格并列关系的,就是你是你,我是我,只不过呢,我的一个值呢,可以赋给你而已,这叫增分性提升,这两个呢,没有子父类关系,所以说呢,当我们这个父类中,你要是是一个基本数据型,那子类这个必须呢,这个类型跟它是完全一样的。
15:04
啊,这个要注意来这个事儿呢,我们去演示呢,也非常的容易。非常容易,比如说比如说再写一个。写一个public,写一个double型的,写一个in for1。诶,这时候大家注意啊,咱们这个写这个知识点的时候,Person也好,Student也好,这里边呢,咱们是为了讲这个知识点,所以呢,大家看到我这里写这个类呢,可能会稍微乱一点,一会儿定一个音份啊,一会儿定一个受啊,就是没有特别固定的一个含义了,就是为了测试咱们这里边的一些知识点,那回头呢,咱们讲这个练习的时候呢,写的会稍微规范一些,大家下来的话呢,就格式上呢,主要是参照咱们讲练习的这样的一些规范。那么讲这个例题的话呢,主要大家呢,去吸收咱们讲的这些知识点啊就可以了。行,那这呢,我定一个叫IN1,暂时的话呢,我先return一个1.0。行,把这个方法我们CTRLC一下,我放在这个子类当中。
16:02
放在这儿。那当我们把这个double类型我改成是一个int。这个位置呢,相应的我也改成是一个这个一的时候,此时呢就出错了。你看这个出错的信息呢,说你这个反应类型这块呢,是呃,Incomt就是不适合的或者不合适的这样一个情况。就是他认为这个int呢,跟我们这个double呢,是两个并列关系的,你这呢必须让它俩一致相同,才认为你是一个重写,所以这呢,我们就只能把它先注释掉了。行,这呢,就是咱们所说的这个叫返回值类型这块这样的一个要求比较细致,大家呢注意一下。权限、修饰符、访问类型、方法名、形态列表这的都说完了,这个方法体呢就不用多说了,那么对于重写的方法来讲,方法体一定是不一样的。咱们也说过了,你要一样了,那就没有必要呢进行重写了,行,这就过了。那么这儿呢,是咱们说的这个重启的这三条规则,那其实的话呢,还有一条规则,还有一个第四条。
17:05
第四条,那么在这个方法层面呢,我们说也就这么几个点,怎么还有第四条呢?那么一个方法的话呢,咱们后边呢,会讲一个叫异常,在这个方法的声明位置呢,后边可以加上一个Rose,加上咱们叫异常的类型。是这样子的啊,那么为了咱们把这个肉这个这个重写的这个事儿呢,说完整了,咱们把这个知识点呢,也给大家先引进来,目前呢,咱们没有Rose,所以大家呢就只需考虑这三点,后边呢,咱们讲到异常的时候呢,咱们呢要想写重写的方法,还得要考虑这个Rose这样的情况,所以呢,出于这个重写的一个完整性,我把它呢也补充上。那么在这个异常方面呢,是怎么规定的呢?我们说子类重写的方法。重写的方法,抛出的异常类型,这个异常类型呢,我们说不大于。我们父类被重写的方法。
18:03
抛出的异常类型。抛出的异常类型。也就是说呢,我们异常类型这块的话呢,它其实也有一个子分类的一个关系,我们这个子类这个方法当中,你这个呢,反馈这个类型呢,是可以小一点的,就是说可以是我们父类中被重写的这个方法的一个子类。啊,一个子类这两个呢,有点像咱们刚才说的这个反应之类型了,就是父类这个反应之类型呢,这个负类被重写的方法,反应类型你可以是个object。Object,然后下边呢,你这个重写的呢,可以是一个string,就这是个词类,那么抛出异常也是一样,我们负类这块呢,回头咱们会讲这个异常啊,诶我这呢,可以是抛一个叫exception。这呢是一个比较顶级的一个异常了,然后我们这里边呢,子类中你可以抛一个它的子类叫做runtime exception。Runtime的exception,这个可以是我们负类中被重写方法的一个子类。
19:05
行,暂时的话呢,大家呢,先听一听就完事了,咱们呢,具体放到异常处理的位置再讲。到时候呢,我们会把这个事情呢再说一下,包括呢也会讲一下,为什么这个可以是更小的,不能够是更大的这个呢,到时候我们再讲。好,那么综上的话呢,咱们就把方法的重写的规定呢,那就说完了,需要大家呢清楚这样的几个点。需要大家清楚这样几个点。嗯,真正在开发当中,下边我说这样的一个点,真正在开发当中啊,我们其实呢,不用记这么细。我们不用记这么细,什么意思呢,大家看。如果真正开发当中,比如说我现在呢,想重写这个work方法了,那怎么办呢?我就呢直接把整个这个方法的声明CTRLC一下,在我们这个子类当中,我这块呢就直接CTRLV,然后呢写它这个方法体。
20:05
说这样呢,一定错不了,说我们这儿呢,就是一个叫重写的方法。奥斜杠。大家想。我们这个子符类在重启的时候呢,说子类呢,跟父类的方法名现在列表一样,那我粘过来的肯定能一样,那反这个权限修饰符,全身修饰符的话呢,说可以更大,那我就不大了,我跟你一样。那反应类型,反应类型的话呢,说呃,像Y的要么跟你一样,要么呢,说有反应之类型的,我还可以比你呢更小一点,那我也跟你一样,也就是说呢,我们子类重写的方法,通常情况下咱们的权限修饰符繁殖类型啊,那这块呢,都是一样子的。那我这儿呢,就直接粘过来了。这儿呢,我们就直接粘,这呢不是叫偷懒,这叫智慧的体现。这样你写肯定写不错,你不能怎么着呢,不能说我现在要写一个work方法了,怎么着呢,我先看一下负类,你看啊public word work行,然后这块呢,就开始去吭哧吭哧自己来写,这个呢是很容易写错的,你像这个work alk一不小心你写个1K,这呢是个in特型的,你写成一个这个double类型了,是不是?显然呢,我们这就根本就不能构成这个叫重载了。
21:21
那不能构成重载了,当我们造了一个此类对象,你调了一个work的时候呢,你以为是个重写的,嗯,说错了啊,就不能构能叫重启了,当你造了一个子类的对象去调这个work方法的时候呢,你以为该去调这个子类重写的了,结果呢,发现没重写,其实呢,你结果回来一看啊,这个写错了,那这呢就比较尴尬。像这个类型呢,也写错了,所以大家呢,就不要自己去写了,一定呢给它粘过来这样的一种方式。行,这呢,就我们说的如何,大家实际开发当中去做重写,这是一种方式,还有一种什么方式呢,大家看。我在这个子类当中,我写一个wal,我out斜杠一下。
22:03
大家看。这个时候呢,我们出来这样的一个几个结构,第一个话呢,说你是不是要定一个叫WL的一个方法呢,这个我们不是那第二个work方法,说你是不是现在要重写咱们父类中的这个work方法呢,其实是的,这时候我就直接双击一下。双击一下,这时候super呢,我没有见到,没见过大家呢,先删掉,那里边儿呢,你就还照样呢,进行一个重启就OK了。上面呢,这个overwe呢,其实是一个注解了,就是表示咱们下边这个方法呢,是一个重写,这个你要是不熟的话呢,咱们也可以先给它删掉,后边咱们讲注解的时候呢,会说。行,这呢也是一种方式,直接呢大家去使用这个提示键,这个提示键去操作也可以,这是咱们真正开发当中,大家去重启的一种方式啊,这呢大家记住它不要呢亲自去写。那么这四个点的话呢,虽然说咱们开发中不会抠这么细,但是大家呢也需要呢,记住它我这呢打一条线。
23:01
这个线下边呢,再说一个事儿。啊,这里边儿事儿还真挺多,再说一个什么事呢。写这样个问题说呢?嗯,子类和父类中的叫同名同参数的这个方法。说呢叫要么呢都声明为。叫非static,那要么呢,都声明为。叫stalic,哎,我们说了一个这么个事,儿子类和父类中同名同参数的方法,按说呢,我们要考虑呢,进行一个重写了。但是这时候呢,说你要么呢,都是非sta非static,这个时候呢,咱们才可以去考虑这个重写的事儿。因为你还涉及到其他的这样的几个点呢,是不是满足的问题。就是非static我们才考虑重写,咱们上面呢,都没有说static的事儿。那也要么呢,就是你都声明成是static的,那就都是这个静态的,这个静态的话呢,咱们就不叫重写了,就是如果呢,我们看到父类当中声明过这个static的方法,那么这个static静态的方法是一定不可以被重写的。
24:16
是这样的一个原因。这样一个事儿。相当于呢,就是咱们目前虽然没有讲这个static啊,相当于咱们在一个方法当中,除了写权限修饰符,反之类型方法名,形态列表抛异常之外呢,在这个位置。在权限修饰符的后面呢,我们还可以声明像final static abstract这样的一些,这个也算是叫修饰符吧,那这里呢,咱们主要呢,提了一下叫static的问题。Static的问题,那简单举例说一下,比如说呢,咱们刚才写的这个方法,我们在student这块呢。加了一个这个小三角,当我们把这个person中的这个方法改成一个叫static的时候。加上一个static,我们student中呢,首先呢,它报错了,这就提到了说你要么呢,就是都声明为非static,要么都是static,我们需要呢,先把student当中这个也得加上成一个static,但是此时呢,虽然不报错了,但是这已经不是方法的重写了。
25:18
只有呢,Face sta呢才叫重写,或者才可以考虑呢叫重写。嗯,就是因为呢,咱们静态的一个方法呢,不能够被覆盖,是随着类的加载而加载的,这个事儿的话呢,咱们讲到这个static关键字的时候呢,给大家呢,再详细的去说,先明确一下这个问题。我这呢打了一条线,上面这些呢,才是咱们重写的一个规则,这个呢是额外的大家关注一下这样的一个情况。这儿呢,就是咱们关于这个重启的一个细节情况。
我来说两句