00:01
嗯,好了,同学们,那咱们这个回顾就回顾到这儿啊,咱们还得下午的时候,还得接着去讲一些新的东西,对不对,哎,还得去学一些新的东西啊,咱们来看一下,呃,来下一个例子吧,直接上啊。Method test07了啊,第七个例子就说,你看杜老师白天最主要讲的还是啥呀?还是理论,是不是最主要还是理论。然后呢,你们的课下呢,可能就需要去把这个理论先给它消化了,该背的背,该记的记是不是,哎,然后接下来,哎,我说的这些语法,你最好自己写一些例子能测一下啊,你把这个东西一切都磨碎了是吧?都给他掌握了,都给他理解了,然后接下来你再考虑是说我去做做练习题的事儿啊,去做练习题,那练习题你不一定说你上来就能做出来,是不是啊,那你上来都能做出来,那那咱们。也也太轻松了嘛,是不是啊,也太简单了啊,学这个东西其实你还是得付出一下啊,慢慢的去打磨啊,经过一个长期的磨练,最后呢,你才能出山啊,来public class method test,零七,来public static啊。
01:12
呃,分析以下程序吧,就是我给大家写一个程序啊,你分析下这个程序编译器会不会不会报错,编译器会不会报错啊,就这个例子啊,主要是大家啊,分析以下代码啊。会爆破吗?啊,我写一个程序啊各位在这里呢,有个public static啊嗯,返回什么呢?返回一个int吧啊,返回一个int啊,然后这个方法叫M,我随便起一个方法名啊M。呃,会做练习题不会背,我的天,那你这个。不会背,其实同学们我问大家一个问题啊,咱们课堂上要求背的东西,就是从杜老师口里说出来,让你死记硬背的东西多不多?让你死记硬背的东西多不多不多吧?
02:01
我自我感觉啊,跟别的老师比起来,我这块还是不是说呃,老师给大家提啊,这个背会啊,啊这个背会这个你们很少提吧。有些地方说大家能够理解的,尽量去理解对不对。所以说我觉得,嗯,这个东西啊,有一些极个别的地方是需要一下,不是所有都啊,不是所有都。如果说你会做练习题,不会背。你应该没问题啊,因为你会做练习题,就意味着你之前已经掌握了啊,之前已经掌握了,来我们这块呢,我写到哪呢,就写这么一个例子,大家分析一下代码。啊,编译器会报错吗?就是没说的,就理解应用就行。你要是能写出来练习作业,那就没啥问题啊,没啥没那肯定是没啥,你之前肯定都都掌握了啊。好,那这块呢,有一个什么呀,不玩类型,假如说啊sex。然后呢,或者是flag随便给一个值啊,Flag默认值呢是吧?啊那if啊,如果我们flag啊,如果flag成立的话,我们直接return什么呀,一个一好,我们大家分析一下这个程序啊,分析这个程序。
03:17
编译会不会报错?各位。这程序汇报错吗?编译器会出问题吗?会出问题报错。那我们来编译一下。编一下。会类型不兼容。这不int吗,这一呀。类型兼容啊。没有声明行参,哎,行参必须要声明吗?宇啊。行参是必须要有吗?这个地方的行参是必须要有吗?空白不行吗?
04:04
空白行不行?空白行吗?没问题啊。哎,伟斌说的好像有点道理啊,全部可能性都应该用。编译一下没有返回值。VO不需要值,不需要值,这个是int呀。五中啊,这是印他。就是返回印他。啊。JVM不知道flag flag只是个变量,来,我们编译一下。Java编译一下啊,Method test07加va。说,缺少返回语句。这个编译器编译的是14行,第14行这一块说缺少返回语句。就你整个这个方法缺少反馈语句,那有同学就懵了,哎,老师不对呀,这不是有这个反馈语句吗?这不有这个反馈吗。
05:00
但是呢,大家注意了啊。注意了。我之前是怎么跟大家说的。啊,我之前是怎么说的,我说这个方法上,如果这个位置有这个返回值类型的话,是不是你必须能够在程序里边保证什么呀。100%的,100%的干什么,必须得执行一个return语句吧,对不对,好,那么大家看这个程序啊,这个程序当中啊,有一个判断,也就是说只有当这个变量的值如果为true的情况下。如果为true的情况下,才可能去执行我们大括号里面的return语句,对吧?那对于编译器来说,它是不是会判断?呃,对于编译器来说,他是不是知道flag是一个布尔类型,但是编译器。会认为这个值有可能是什么,编译器认为它有可能是,也有可能是什么false,那编译器就在想了,如果这个是false的话,就会导致这个return语句怎么着啊,它不会执行。
06:07
那如果这个return语句不执行的话,那就相当于你没有办法保证你这个方法执行结束之后一定会有一个什么呀,哎,Return语句的执行,所以呢,他会认为你缺少什么呀,哎,返回语句。那有同学就说了,老师这个flag不是吗?好,同学们告诉大家。这个位置啊,对于我们编译器来说,编译器不运行程序啊,编译器不负责运行程序。编译器只讲道理啊讲道理。明白吧,哎,不负责运行。他编译器只负责讲道理,就像刚才呃,咱们这个小鹏说的在呃这个编译器啊,实际上怎么着啊,他不知道这个flag是true。啊,对于编译器来说,编译器只知道flag是一个布尔类型。
07:04
就是你这点你得知道啊,就是说对于谁啊,对于编译器来说啊。编译器只知道什么呢?只知道flag变量是布类型啊,编译器会认为会认为什么呢?Flag有可能是false,有可能是true。那如果编译器这么一。这一点都不想当。嗯,编译器它只讲道理的,对他这个有道理啊,人家说的是不是你这个是不玩类型,那你就意味着你这个有可能执行,有可能不执行,所以说编译器啊,觉得觉得什么呢?以下这行代码可能会执行,当然也可能怎么着啊,不会执行。啊,编译器,为了编译器,为了确保程序不出现。
08:09
任何异常,所以编译器说说什么说缺少返回语句啊,缺少返回语句,所以这个程序呢,它还是比较经典的啊,非常具有代表性的,现在是第90第19行缺少返回语句,那大家呢,要看一看啊,这个代码这样写你以后啊,就还是不行的啊,啊还是还是不行的,它只编译不运行啊就是这样的,所以这块呢,大家得接受这个现实啊,编译器不像大家想象的那么智能啊。那人就是讲道理的呀。对,就是这意思啊,我要我觉得不要你觉得对这编译器认为这个地方它是个讲讲道理啊,这个地方是个布尔类型啊,布尔类型有可能是处,也有可能是false,那就意味着这个大框里面代码有可能执行,也有可能不执行,对吧,你有可能执行return语句,也有可能不执行return语句,而你的这个方法在反应类型写了个int,写了个int就意味着你这个方法结束,必须百分百分100%的保证,必须反回什么呀,In类型,但是你没有办法,没有这个实力保证这个语句一定会执行,所以他会认为你缺少反馈语句啊,你怎么去改这个程序呢。
09:17
怎么修改这个程序呢?来,我们有多种方案啊,第一种方案我们可以怎么做,各位怎么改啊?就像刚才我看到有同学在在写的啊,写的什么呢?在这加个else。加else,诶return什么呀,假如说这个的话,我们就return一个零。行不行啊,哎,这是第一种方案。可以吧,那有同学说老师这样就行了吗?哎,可以了,为啥?因为有没有听杜老师曾经说过if带着else的情况,我们在编译器角度来说。编译器角度来说。怎么说呀,哎,编译器。
10:01
会认为你肯定会有一个分支怎么着执行?我之前在讲if语句的时候,有没有给大家说过,如果说一个程序if语句啊,有带else分支的话,是不是就可以保证我们100%的一定会有一个分支执行,这句话我曾经说过吧?对吧,哎,那编译器看到这个带着else,这里边有return,然后带着if这个分支比有return,那编译器会认为你怎么着啊,你这个有可能执行对吧,那如果这个执行不了,这个肯定肯定100%,100%执行,所以这个肯定是有这个return语句的,那么这种方式行不行呢?那百分百可以啊,来编译看就通过了是不是,哎,所以说呢,这是第一种方案啊,是加一个else分支。带有L是分支的啊,可以保证一定会有一个分支执行啊,所以这个就可以啊,可以没问题,你看。你看是吧,哎,编译一下对不对,哎,没有任何问题啊,所以呢,在写的时候大家还得注意一下,但是呢,大家想一想,这样去写代码是不是就有点儿有点啰嗦了啊,大家看第二种方案,我直接这么干行不行,来复制一下。
11:08
第二种方案,我直接把I干掉,不要了行吗?我在这个位置写个return行不行?好,各位告诉我这种方案行不行?第二种方案,这种方案行吗?啊。就把那个去掉,这样写行吗?各位行的话打个一。行的话打个一。可以。可以。啊,可以是吧,好,我说一下各位啊,其实第二种方案和第一种方案是一样的,只不过是第一种方案的一个变形。注意啊,该方案实际上啊是方案一的变形。该方案实际上是方案一的一个变形。
12:00
啊,是方案一的一个变形,大家知道我曾经说过一句话,什么呀,叫return语句,一旦执行方法就结束,对吧。如果程序能执行到第43行,这这足以说明上面这个是不是没执行。哎,我是不是曾经说过return语句,一旦执行方法结束,对吧?Return语句啊,一旦执行所在的方法就会怎么着结束,如果他能到这儿,这说明什么,他没执行。他如果执行了,这个就执行不了。对吧,哎,他就执行不了。啊,所以说这块呢,其实要么执行他,要么执行它。对不对,实际上和上边是不是一样的呀,哎,所以大家以后要这样去写这个程序啊,这样写这个程序。啊,你看。对,如果不是return,那就不一样了啊,你这个return一旦执行,那你这个方法就结束了,如果程序还能到这儿的话,这说明你这个没执行。你这个没执行,那就执行这个呗。是不是这种方案也行的,你看编一下,你看通过了吧,是不是没有这个问题啊,那么接下来我们来看一看什么呢?Return语句,语句下边能不能写代码。
13:11
就是我们把这个复制一下啊,复制一下之后呢,我们接下来贴过来放到这儿,诶我问大家一个问题啊,这个return语句下边能不能写代码,就是比如说在这儿能不能写一行代码。如果我们把代码写到这儿的话,对HELLO1,那么这个能不能编译通过呢?这个能不能编译通过呢?行不行呢?哎,编译器肯定会报错编译器啊,它检测到这个地方有个return。那如果说这个return语句一旦执行的话,这个方法就结束了,这行代码根本就没有意义,你写到这儿根本就没有意义,所以编译器啊,它会提醒你,所以编译器给你报错了。来看变异器报什么错?他说无法访问的语句哇,编辑器太智能了,他说你53行无法访问到,就无论如何53行你这行代码是无论如何都执行不了的,你写到这干啥呀,所以编译器它不让你写。
14:03
你看是吧,所以说编译器还是非常非常智能的啊,在这还还是很很智能的啊,很智能的无法访问的语句啊,就是return语句下边是不能够写这个这个代码的,写上代码就出错了啊,出错了那么我就往下边写,写到这个位置行不行。各位告诉我这样行不行?这句话是不是也是在这个return下边。我把这句话写到这行吗?那为什么这个就可以了呢?为什么说这个system.out.print打印输出这输出这个东西,这行代码为什么放到这儿就行了呢?哎,大家注意,因为它呀和它不一样的地方是什么呢?它呀是在这个大括号里边了,这句话呢,它已经脱离了这个大括号。那就意味着什么呢?如果你这个不执行的话,我下面代码会执行。所以我这个代码是有执行机会的,对吧?哎,是有执行机会,是不在同一个域里边啊,这个不在同一个域当中啊,这行代码和上面的代码。
15:07
哈一的区别是不在什么同一个域当中,不在同一个域里边啊,所以这块你看编译一下,你看它就允许对不对?好,那我再问同学们,如果这句话八放到下边这哈三放这行不行。那这个大家想一想,是不是只要这个语句执行,我们整个方法是不是就结束了,对吧,这行代码是不是更就没有没有执行的意义,对不对,永远就执行不到了吧,所以这个时候你再去编译,你看是不是还是不行啊。对吧,说无法访问的什么,哎,语句无法访问的语句在59行这块,所以这块呢,同样它也是什么呀,不行的啊,所以你要知道return下面在同一个域当中啊,Return在同一个域当中,Return语句下边啊return语句。下面不能再不能再编写,不能再编写其他代码。
16:07
啊,Return语句下面不能再编写其他代码。啊,在同一个域当中,Return语句下面不能再编写其他代码啊,编写之后编译报错。编译报错,编写之后就编译器报错了啊,这个事儿要提醒一下,提醒一下啊好,那这块呢,你要放开这个,那就没问题啊,没问题你看是吧,来编译一下,你看其实我觉得,但这个需要死记硬背吗。这需要死记硬背吗?我觉得不需要啊,别让自己学得累啊,这个东西有讲道理啊,这人说的有道理啊,是不是这行代码,那你想想有可能执行了,有可能执行,因为你这个条件不成立的话,我这里就执行了呀。是不是如果你这个条件成立的话,这个return这个方法就结束了,是不是,但你这个return只要你执行下边的代码是就没法执行,对吧,所以说你写到这儿那就不行啊,你说这个return执行的下边代表能不能是不能执行,所以这个呢就没有执行的机会,这个呢也没有执行机会,这个呢是有执行机会的啊,所以这块呢,咱们也不需要死记硬背啊,其实这块理解一下,在理解的基础之上去记忆,我觉得会更好一些啊,更好一些。
我来说两句