00:00
我们来看一个一个试。各位新建class啊,我们的叫exception test13。TEST13,各位啊。那么这个我们来看一个面试,这个面试。是经常出现的一个面试题啊,Public static,然后呢,我们就叫做M。非常之简单。然后呢,在这里呢,加一个TRY,然后加一个finally。然后这里是int类型的I等于100,然后呢,Return这个I,然后呢在这I加加。A加加啊,然后这个I呢,它的声明我放到外边吧。啊,然后接下来把这个I呢,返回我们在这块呢。嗯,Return I啊,这这块去掉就行了,去掉去掉上面已经return了啊来接下来我们调这个方法各位。
01:06
调这个方法M方法,M方法调用会返回一个结果,是不是哎,Return value或者result。那么这个结果是多少?这,这是个面试题。很有意思的一个面试题。一。100。这个结果让大家意外了啊。让大家意外都是101是吧。来,走一下。100。各位啊,这个结果是100意外了吗?是不是意外了啊?有的老人不对呀,I等于100啊。然后再往下走。它执行find里边I加加吗?101啊,返回这个I不是应该是101吗。
02:01
是不是啊?这个呀,比较特殊,解释不了,各位啊,这个题解释不了,解释不了比较特殊。惊不惊喜,意不意外啊,嗯,这块呢,是这样的。嗯,因为I呢,咱们Java语言啊,它有个规定是不是。得套路,得天下。说一下啊,是这样的,就是说Java有一个Java有很多语法规则,Java语法规则,有些规则是不能被破坏的,你要知道啊,有一些规则是不能破坏的。一旦这么说了,就必须这么做。啊,什么意思?Java中有一条这样的规则,有一条啊,这样的规则就是方法体中的代码,方法体中的代码必须遵循什么呀,自上而下的顺序。
03:04
依次逐行执行,这是亘古亘古不变的。语法,他必须得保证这种语法是正确的。那么这个return出现在int I等于100的下面,所以最后的结果必须返回100。那么才能符合这个语法规则。注意啊,来Java中有一条这样的规则,就是方法体中的代码必须遵循自上而下的顺序,依次逐行执行。明白吗?这行代码出现的int I等于100下面这行代码出现在什么呀?Int I等于100的下面。所以最终结果必须是。返回100,必须返回100啊。
04:01
必须返回100,但这行代码确实是在A加加之后执行的,注意啊,还有一个语法规则对吧?Java中还有一条语法规则。也是亘古不变的,就是return语句,一旦执行,整个方法必须结束啊,这也是叫什么呀,亘古不变的语法,这两套语法它都不能违背,你明白什么意思吧?Java并没有违背这两套语法,也就是说让他怎么着?先执行,然后再执行它。他执行完整个方法结束,并且这行代码出现在我们这行代码的下方啊。所以他还必须返回100。明白吧,哎,Return语句还必须什么呀,保证是最后执行的,一旦执行整个方法结束,这两条语法规则都没有违背,为什么?有图老师你怎么知道?来我们看一下它这个反编译之后的代码行不行?就这个是不是编译之后的代码啊?
05:13
这个。编译之后的代码啊,这这这这是不是编译之前的原代码,对吧,我们看一下它的class文件行不行。我们看一下class文件啊。Return就是后边执行,记住啊,这个return一定是在最后执行的。这个return语句啊。一定是最后执行的。啊,一定一定是最后执行的啊。嗯。这个是亘古不变的语法啊,然后自上而下的顺序,他也不能打破这个代码,在这个代码下面,所以这个代码是100的话,这个返回必须得是100。
06:02
我们支付看一下嘛,它的Java源代码嘛。Java源代码,我们得看一下它的自检码是啥?是不是来看字节码啊,有同学怎么还能看字节码,字码能能打开吗?来cos嗯这块找找这找找,这个叫做嗯。这个字节码在什么地方找一下啊,呃,Program file,然后这块有一个叫做。不是在这,在哪,在这儿。用户administrator啊,Idea project加IC,然后21。这是源代码。呃,它编译之后呢,应该是这。应该是这个21走。走走。是这个吧,应该是exception test13吧。我们瞅一眼啊,是不是没问题吧,哎,那这个文件怎么打开啊各位。所以我们这里需要使用反编译工具。反编译工具啊,我们看看它底层怎么做的,是不是不就一切都都都明白了吗?
07:00
对吧,哎,我们看一下啊,找一个反编译工具,我们这个反编译工具有没有。啊,我这儿应该是给过。嗯,这个是反变形工具。这个是啊,但是这个反编译工具功能不够强大啊,反编译啊就是编译,还有反编译什么叫编译啊,编译就是Java文件变成class文件,如果你把class文件再变回成Java文件,这叫什么呀?反编译。反编译这个方向叫编译,从class文件再变成Java叫反编译,我们看class就知道了。但现在这个地方好像那个反编译工具没了。这样吧,我从网上找一个行不行,找一个那个那个牛的那个那个那个收费的啊,但是能试用几天。能试用几天啊?
08:00
DJ。D compile。DJ JA DJ Java comp,就这个download。我看一下瞅一眼啊。Download for Windows。稍等啊。这个是不是能下载。4.1兆不大吧。对吧,但是估计下载比较慢是吧,看看。我的天,能忍受吗?0.1。我的天。哎呀,我的天。貌似有点快啊。太慢了。有这么一个反编译工具啊,挺好。一这个能不能下载快点?
09:02
我先找找。下载地址。要不我们就等等这个吧。行吧。等一下这个啊。2.1兆。不会下载到。四零,停下来。稍等啊,这个工具是官方的,我从官方可能会比较好。稍等马上啊,马上就可以了。咱们看一下这个反编工具啊。3.3。3.4。我。36。27。稍等啊。八九。420。
10:00
4.1欧了。行,太完美了啊,完美了,来稍等啊。这个工具给大家分享一下呗。是不是截到当前文件夹。解压之后就是它呗,是不是它我给大家分享一下,放到那个COS02,然后兔子里边。这个工具呢,我叫做。反编译工具啊。拿过来双击安装一下啊。看看这个啊,点下一步,下一步啊就不用了,直接直接安装就行啊下一步。安装。不大不大啊,挺小的,然后接下来呢,这个安装完之后呢,你看这个文件是不是就变了,有这种图标了,是不是点class文件,你看是不是来直接双击打开啊。他说welcome使用DJ什么Java com是吧?嗯,我有一个序列号。咱没有序列号啊,点下一步对。嗯。
11:01
啥玩意儿?这是IAM under。Under the age of over the age。行就下一步吧,选这个啊,点下一步试试。什么情况?来运行一下。哎呀。允许啊。允许。好了,打开了吗。打开了吗?没打开吗?来,拖过去走。好好大家看啊,非常非常牛的一个工具啊,来把class文件拖进去,它就它就它就它就有代码了,好各位看一下啊,看一下这个代码。看这代码是怎么走的,来,这是反编译之后的代码啊,拿过来。拿过来这个代码各位啊,然后呢,我给它放到我们的程序这,大家看看它的程序是怎么走的行吧,就这个代码它反编译之后的效果。是这样的,大家分析一下。
12:01
分析一下。各位分析一下,各位啊,现在就分析来看看A加加是不是在return之前执行。就这个I加加是不是在return之前执行。它int I等于100,是不是把I给了J,然后最后对I加加,最后返回J吧。你有没有发现这个return一定是在最后执行的?这个代码没关系的,你就不用看了啊,这是异常相关的一些东西,你就不用看了,这是反编译之后的程序。反变异之后的效果就是这个德行。看见了吗?I等于多少100,然后他临时在这给把I给了一个G,然后对I加,加是一定要执行的,Return是一是最后执行的。看见了吧,它反编译之后,代码就是这样一个代码,它的底层执行原理是这样去执行的。好,那我问大家一个问题啊,我问大家问题,这样执行是不是最后一定是100。他是不是遵守了这两个语法规则?
13:02
你好好思考一下,它既遵守了代码从上到下依次逐行执行的一个亘古不变的语法,同时又遵循了另外一个语法return语句一定是什么,最后执行的这个语法也是亘股不变的,它这两条规则都满足了,他怎么满足的?他在后台是不是先把I的变量赋给了J,然后I加加返回J呀?对吧,你看是不是这代码就改了。所以大家一定要记住啊,Return语句是不是最后执行的?就我问大家问题来回复个一,你收到的回复个一啊,Return语句,我说的说有有没有毛病,Return语句是一定最后执行的。一定最后执行的。各位,Return语句是一定最后执行的啊。然后他必须得遵循,而且还得遵循另外一个语法规则,什么规则就代码它是从上往下依次逐行执行的,执行成这个,这个按说应该就返回100,所以大家看它在它在这个返这个编译之后,它生成的代码是不是一定是先干什么。
14:05
先是I等于100,然后把I付给了ji加,加是一定会执行的,Finally是一定会执行的,然后再去执行return j return语句一定是最后执行的。一定是最后执行的啊,很诡异对吧,很诡异啊,其实你能够理解S公司的这帮人的,呃呃,这个叫良苦用心啊,他的用心是啥呢?就是说他不能违背他自己的语法规则。两条语法规则,哪两条return,第一必须最后执行,这是第一啊第一啊第二,这个方法体的代码还必须得遵循自上而下的顺序,依次中方执行,于是乎呢,他在这里就找了个临时变量。对A加加,然后反馈这个临时变量个值。对,跟之前那个I等于I加一是一个意思。I等于A加一是一个意思啊,是一个意思,对。
15:01
取了临时变量一样的啊,就最最最咱们开始的时候有一个问题不是很纠结吗?是不是I等于100,是不是1G。这个代码怎么写的?音,呃,就是iii等于什么呀,A加加是不是,哎或者是I等于加加I啊,就类似的代码,其实是一样的一个道理啊,一个道理。之前这个例子。你他干嘛呀?你反编译它干嘛,没有意义啊。你反编译他干嘛,没有没有用啊,你你这个可以理解啊,你下边不执行是因为你这个直接把贾晓旭你干死了。所以点exit直接直接加马逊你就崩了,那还执行啥呀。这里又没有return,又不矛盾。这里之所以矛盾是因为是因为这个return语句导致的,这个return语句它比较敏感,只要它出现方法就结束,但是finally语句还得执行,所以呢,一定是先执行这个,再执行这个,最后执行return。但是尴尬的问题又来了,你最后执行return返回,如果101的话,就不符合规则了,因为你明明是100,这就应该返回,最后的结果就是100才对,你返回101就有点儿问题了。
16:15
啊,就就就矛盾了,明白吗?就矛盾了,所以S公司为了解决这两条矛盾,然后为了保证这两条语法能够正常的去顺延下去,他说的是对的,他总不能说你抽大抽大嘴巴抽自己对不对,刚刚说完一句话,戴雷遵循自上而下的顺序,依次逐行执行,咔嚓到这就换了,这不行啊,所以这个东西它得遵守这个规则,所以它在底层这个代码生成的时候这样生成的。这样其实有的时候你可以看看它反编译的结果,你一切就明白了啊,一切就明白了,好了,这个呢,咱们就说到这儿好吧。
我来说两句