這是京東校招的筆試題:java
打印運行結果,就是3
。測試
咱們將return
與finally
拆爲幾種狀況綜合分析。spa
private 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; }
看執行結果,咱們分析return
的原理。3d
try
中執行到return
時,先把這個值存起來,再開闢一塊內存存這個值,而後去執行finally
,finally
執行以後,回去執行以前沒執行完的return
語句,將值返回。因此這種狀況下,finally
後的代碼塊是不執行的。code
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; return a; } }
這就和筆試題中同樣了。對象
try
中return
,而後去執行finally
,發現finally
中也有return
,而後就執行的是finally
中的return
,返回值爲3
。blog
將上一個例子中finally
中的return a;
刪了,就是咱們接下來的測試。咱們看看finally
中對變量的改變對返回值有沒有影響。ip
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;
it
finally
中a = 3;
這裏雖然執行了a = 3
,可是改變的是a
的值,並無改變返回值。
要是不信咱們在finally
再添加一行輸出以驗證咱們的猜測。
相信這裏我分爲兩個類別來敘述,熟悉Java
的你應該明白我接下來要說什麼了。
建個類MyObject
,這裏是爲了演示方便纔將value
設置爲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
中修改對象的屬性。
運行,返回的結果是咱們在finally
中改變過的值。
finally
中改變的,是myObject
這個對象的value
值,這個對象在堆內存中,而棧內存中用於返回的對象,其實也是堆內存中對象的引用,因此finally
的改變會改變引用數據類型的返回值。
格物致知,這是對基礎的最佳實踐。