摘要:中,然后去執(zhí)行,發(fā)現(xiàn)中也有,然后就執(zhí)行的是中的,返回值為。我們看看中對(duì)變量的改變對(duì)返回值有沒(méi)有影響。中中中這里雖然執(zhí)行了,但是改變的是的值,并沒(méi)有改變返回值。
問(wèn)題描述 筆試
這是京東校招的筆試題:
運(yùn)行打印運(yùn)行結(jié)果,就是3。
分析我們將return與finally拆為幾種情況綜合分析。
finally之后returnprivate static int func() { int a = 1; try { System.out.println("try"); return a; } catch (Exception e) { System.out.println("catch"); } finally { System.out.println("finally"); } System.out.println("afterFinally"); return 10; }
看執(zhí)行結(jié)果,我們分析return的原理。
try中執(zhí)行到return時(shí),先把這個(gè)值存起來(lái),再開(kāi)辟一塊內(nèi)存存這個(gè)值,然后去執(zhí)行finally,finally執(zhí)行之后,回去執(zhí)行之前沒(méi)執(zhí)行完的return語(yǔ)句,將值返回。所以這種情況下,finally后的代碼塊是不執(zhí)行的。
finally中returnprivate static int func() { int a; try { System.out.println("try"); a = 1; return a; } catch (Exception e) { System.out.println("catch"); a = 2; return a; } finally { System.out.println("finally"); a = 3; return a; } }
這就和筆試題中一樣了。
try中return,然后去執(zhí)行finally,發(fā)現(xiàn)finally中也有return,然后就執(zhí)行的是finally中的return,返回值為3。
finally中改變變量的值 基本數(shù)據(jù)類(lèi)型將上一個(gè)例子中finally中的return a;刪了,就是我們接下來(lái)的測(cè)試。我們看看finally中對(duì)變量的改變對(duì)返回值有沒(méi)有影響。
private static int func() { int a; try { System.out.println("try"); a = 1; return a; } catch (Exception e) { System.out.println("catch"); a = 2; return a; } finally { System.out.println("finally"); a = 3; } }
try中a = 1;
try中return a;
finally中a = 3;
這里雖然執(zhí)行了a = 3,但是改變的是a的值,并沒(méi)有改變返回值。
要是不信我們?cè)?b>finally再添加一行輸出以驗(yàn)證我們的猜想。
引用數(shù)據(jù)類(lèi)型相信這里我分為兩個(gè)類(lèi)別來(lái)敘述,熟悉Java的你應(yīng)該明白我接下來(lái)要說(shuō)什么了。
建個(gè)類(lèi)MyObject,這里是為了演示方便才將value設(shè)置為public的,不要效仿啊。
public static void main(String[] args) { MyObject object = func(); System.out.println(object.value); } private static MyObject func() { MyObject myObject = new MyObject(); try { System.out.println("try"); myObject.value = 1; return myObject; } catch (Exception e) { System.out.println("catch"); myObject.value = 2; return myObject; } finally { System.out.println("finally"); myObject.value = 3; } }
與之前類(lèi)似,不過(guò)這里是在finally中修改對(duì)象的屬性。
運(yùn)行,返回的結(jié)果是我們?cè)?b>finally中改變過(guò)的值。
finally中改變的,是myObject這個(gè)對(duì)象的value值,這個(gè)對(duì)象在堆內(nèi)存中,而棧內(nèi)存中用于返回的對(duì)象,其實(shí)也是堆內(nèi)存中對(duì)象的引用,所以finally的改變會(huì)改變引用數(shù)據(jù)類(lèi)型的返回值。
總結(jié)格物致知,這是對(duì)基礎(chǔ)的最佳實(shí)踐。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76855.html
摘要:基礎(chǔ)系列的與方法類(lèi)初始化順序線程池如何彈性伸縮的幾個(gè)要點(diǎn)的緩存什么場(chǎng)景下使用阻塞隊(duì)列的使用及模式中的序本文主要簡(jiǎn)述中有的情況。參考關(guān)于中的執(zhí)行順序 Java基礎(chǔ)系列 Java的hashcode與equals方法 Java類(lèi)初始化順序 ThreadPoolExecutor線程池如何彈性伸縮 HashMap的幾個(gè)要點(diǎn) Integer的緩存 什么場(chǎng)景下使用阻塞隊(duì)列 volatile的使用及...
摘要:隨著的出現(xiàn),我最近發(fā)現(xiàn)自己在我的代碼中使用了更多。但老實(shí)說(shuō),我終于用做了一點(diǎn)練習(xí)。當(dāng)我去實(shí)際使用它時(shí),我有點(diǎn)不確定它的細(xì)節(jié)。事實(shí)上,這就是本文的靈感來(lái)源。 隨著async /await的出現(xiàn),我最近發(fā)現(xiàn)自己在我的代碼中使用了更多try /catch /finally。但老實(shí)說(shuō),我終于用finally做了一點(diǎn)練習(xí)。當(dāng)我去實(shí)際使用它時(shí),我有點(diǎn)不確定它的細(xì)節(jié)。所以我把幾個(gè)例子放在一起。 當(dāng)你...
摘要:隨著的出現(xiàn),我最近發(fā)現(xiàn)自己在我的代碼中使用了更多。但老實(shí)說(shuō),我終于用做了一點(diǎn)練習(xí)。當(dāng)我去實(shí)際使用它時(shí),我有點(diǎn)不確定它的細(xì)節(jié)。事實(shí)上,這就是本文的靈感來(lái)源。 隨著async /await的出現(xiàn),我最近發(fā)現(xiàn)自己在我的代碼中使用了更多try /catch /finally。但老實(shí)說(shuō),我終于用finally做了一點(diǎn)練習(xí)。當(dāng)我去實(shí)際使用它時(shí),我有點(diǎn)不確定它的細(xì)節(jié)。所以我把幾個(gè)例子放在一起。 當(dāng)你...
摘要:隨著的出現(xiàn),我最近發(fā)現(xiàn)自己在我的代碼中使用了更多。但老實(shí)說(shuō),我終于用做了一點(diǎn)練習(xí)。當(dāng)我去實(shí)際使用它時(shí),我有點(diǎn)不確定它的細(xì)節(jié)。事實(shí)上,這就是本文的靈感來(lái)源。 隨著async /await的出現(xiàn),我最近發(fā)現(xiàn)自己在我的代碼中使用了更多try /catch /finally。但老實(shí)說(shuō),我終于用finally做了一點(diǎn)練習(xí)。當(dāng)我去實(shí)際使用它時(shí),我有點(diǎn)不確定它的細(xì)節(jié)。所以我把幾個(gè)例子放在一起。 當(dāng)你...
閱讀 3484·2021-11-19 09:40
閱讀 1503·2021-10-13 09:41
閱讀 2678·2021-09-29 09:35
閱讀 2724·2021-09-23 11:21
閱讀 1716·2021-09-09 11:56
閱讀 845·2019-08-30 15:53
閱讀 853·2019-08-30 15:52
閱讀 606·2019-08-30 12:47