摘要:中,然后去執(zhí)行,發(fā)現(xiàn)中也有,然后就執(zhí)行的是中的,返回值為。我們看看中對變量的改變對返回值有沒有影響。中中中這里雖然執(zhí)行了,但是改變的是的值,并沒有改變返回值。
問題描述 筆試
這是京東校招的筆試題:
運(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時,先把這個值存起來,再開辟一塊內(nèi)存存這個值,然后去執(zhí)行finally,finally執(zhí)行之后,回去執(zhí)行之前沒執(zhí)行完的return語句,將值返回。所以這種情況下,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ù)類型將上一個例子中finally中的return a;刪了,就是我們接下來的測試。我們看看finally中對變量的改變對返回值有沒有影響。
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的值,并沒有改變返回值。
要是不信我們在finally再添加一行輸出以驗(yàn)證我們的猜想。
引用數(shù)據(jù)類型相信這里我分為兩個類別來敘述,熟悉Java的你應(yīng)該明白我接下來要說什么了。
建個類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; } }
與之前類似,不過這里是在finally中修改對象的屬性。
運(yùn)行,返回的結(jié)果是我們在finally中改變過的值。
finally中改變的,是myObject這個對象的value值,這個對象在堆內(nèi)存中,而棧內(nèi)存中用于返回的對象,其實(shí)也是堆內(nèi)存中對象的引用,所以finally的改變會改變引用數(shù)據(jù)類型的返回值。
總結(jié)格物致知,這是對基礎(chǔ)的最佳實(shí)踐。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/76855.html
摘要:基礎(chǔ)系列的與方法類初始化順序線程池如何彈性伸縮的幾個要點(diǎn)的緩存什么場景下使用阻塞隊(duì)列的使用及模式中的序本文主要簡述中有的情況。參考關(guān)于中的執(zhí)行順序 Java基礎(chǔ)系列 Java的hashcode與equals方法 Java類初始化順序 ThreadPoolExecutor線程池如何彈性伸縮 HashMap的幾個要點(diǎn) Integer的緩存 什么場景下使用阻塞隊(duì)列 volatile的使用及...
摘要:隨著的出現(xiàn),我最近發(fā)現(xiàn)自己在我的代碼中使用了更多。但老實(shí)說,我終于用做了一點(diǎn)練習(xí)。當(dāng)我去實(shí)際使用它時,我有點(diǎn)不確定它的細(xì)節(jié)。事實(shí)上,這就是本文的靈感來源。 隨著async /await的出現(xiàn),我最近發(fā)現(xiàn)自己在我的代碼中使用了更多try /catch /finally。但老實(shí)說,我終于用finally做了一點(diǎn)練習(xí)。當(dāng)我去實(shí)際使用它時,我有點(diǎn)不確定它的細(xì)節(jié)。所以我把幾個例子放在一起。 當(dāng)你...
摘要:隨著的出現(xiàn),我最近發(fā)現(xiàn)自己在我的代碼中使用了更多。但老實(shí)說,我終于用做了一點(diǎn)練習(xí)。當(dāng)我去實(shí)際使用它時,我有點(diǎn)不確定它的細(xì)節(jié)。事實(shí)上,這就是本文的靈感來源。 隨著async /await的出現(xiàn),我最近發(fā)現(xiàn)自己在我的代碼中使用了更多try /catch /finally。但老實(shí)說,我終于用finally做了一點(diǎn)練習(xí)。當(dāng)我去實(shí)際使用它時,我有點(diǎn)不確定它的細(xì)節(jié)。所以我把幾個例子放在一起。 當(dāng)你...
摘要:隨著的出現(xiàn),我最近發(fā)現(xiàn)自己在我的代碼中使用了更多。但老實(shí)說,我終于用做了一點(diǎn)練習(xí)。當(dāng)我去實(shí)際使用它時,我有點(diǎn)不確定它的細(xì)節(jié)。事實(shí)上,這就是本文的靈感來源。 隨著async /await的出現(xiàn),我最近發(fā)現(xiàn)自己在我的代碼中使用了更多try /catch /finally。但老實(shí)說,我終于用finally做了一點(diǎn)練習(xí)。當(dāng)我去實(shí)際使用它時,我有點(diǎn)不確定它的細(xì)節(jié)。所以我把幾個例子放在一起。 當(dāng)你...
閱讀 3482·2021-11-19 09:40
閱讀 1499·2021-10-13 09:41
閱讀 2673·2021-09-29 09:35
閱讀 2718·2021-09-23 11:21
閱讀 1711·2021-09-09 11:56
閱讀 838·2019-08-30 15:53
閱讀 852·2019-08-30 15:52
閱讀 605·2019-08-30 12:47