日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

朝花夕拾——finally/final/finalize拨云雾见青天

發(fā)布時(shí)間:2023/12/10 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 朝花夕拾——finally/final/finalize拨云雾见青天 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Java編程中。常常會(huì)使用到異常處理,而finally看似的是try/catch后對(duì)邏輯處理的完好,事實(shí)上里面卻存在非常多隱晦的陷阱。final常見于變量修飾,那么你在內(nèi)部類中也見過吧。finalize作為GC回收對(duì)象前的一道門,什么時(shí)候運(yùn)行。運(yùn)行效果又是如何。有時(shí)看看又忘了。以下是我總結(jié)網(wǎng)上朋友的一些博文及其帖子對(duì)三者進(jìn)行總結(jié)。(重點(diǎn)講下finally)

先看final

  • Final修飾變量不能被又一次賦值,其修飾實(shí)例變量時(shí),定義時(shí)指定值則可視為“宏變量”。在非靜態(tài)代碼塊和構(gòu)造器中初始化值則不是。其修飾類變量時(shí)。僅僅有在定義時(shí)指定值才視為“宏變量”,在靜態(tài)代碼塊中初始化則不是。

  • Final修飾的方法不能被重寫
  • Final修飾的類不能被繼承
  • 內(nèi)部類一般使用final修飾的局部變量。

在看finalize

  • 系統(tǒng)調(diào)用finalize方法具有不確定性
  • finalize方法是protected方法。子類能夠覆蓋該方法以實(shí)現(xiàn)資源清理工作,GC在回收對(duì)象之前調(diào)用該方法。一般當(dāng)對(duì)象在變成不可到達(dá)的時(shí)候,GC會(huì)推斷是否覆蓋該方法,假設(shè)沒有覆蓋就直接回收。假設(shè)覆蓋就把該對(duì)象放進(jìn)F-Queue隊(duì)列并由一低優(yōu)先級(jí)線程運(yùn)行該對(duì)象的finalize方法,然后再次推斷是否可達(dá)。
  • 盡量不要去調(diào)用finalize,假設(shè)調(diào)用。則避免對(duì)象再生,多用于關(guān)閉流。

最后細(xì)斟finally

  • Finall語(yǔ)句在return語(yǔ)句運(yùn)行之后,return返回之前運(yùn)行;
  • Finally塊中的return語(yǔ)句運(yùn)行結(jié)果覆蓋try和catch中運(yùn)行的return語(yǔ)句運(yùn)行結(jié)果
  • Finally塊中操作try/catch返回基本變量時(shí)。結(jié)果不受finally操作影響
  • Finally塊中操作try/catch返回引用對(duì)象時(shí)。

    結(jié)果受finally操作影響

以下給出幾個(gè)樣例驗(yàn)證finally的4個(gè)重要觀點(diǎn)
樣例1代碼例如以下: package java_zhaohuaxishi;public class Example1 {public int test(){int i = 0; try{i = 10;System.out.println("try");return i+=10;}catch(Exception e){i = 20;return 200;}finally{System.out.println("finally");System.out.println(i);}}/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println(new Example1().test());}} 執(zhí)行結(jié)果: try finally 20 20 這也意味著finally打印出來的是try中return已經(jīng)計(jì)算了的,驗(yàn)證觀點(diǎn)一。
樣例2代碼例如以下: package java_zhaohuaxishi;public class Example1 {public int test(){int i = 0; try{i = 10;return 100;}catch(Exception e){i = 20;return 200;}finally{return i;}}/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println(new Example1().test());}} 上述時(shí)沒有出現(xiàn)異常情況,打印例如以下: 10
再給出出現(xiàn)異常情況,代碼例如以下: package java_zhaohuaxishi;public class Example2 {public int test(){int i = 0; try{i = 10/0;return 100;}catch(Exception e){i = 20;return 200;}finally{return i;}}/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println(new Example2().test());}} 打印結(jié)果例如以下: 20結(jié)果是:不管出現(xiàn)異常與否,finally的return總會(huì)覆蓋try/catch中return的結(jié)果。驗(yàn)證觀點(diǎn)二。


樣例3代碼例如以下: package java_zhaohuaxishi;public class Example5 {public int test(){int i = 0; try{i = 10;return i; }catch(Exception e){i = 20;return i; }finally{i=30;//return i;} }/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println(new Example5().test());} } 打印結(jié)果例如以下: 10能夠看到。實(shí)際上finally改動(dòng)i變量是不起作用的。驗(yàn)證觀點(diǎn)三。


樣例4代碼例如以下: package java_zhaohuaxishi;class Test{int num;public Test(int num){this.num = num; }public int getNum() {return num;}public void setNum(int num) {this.num = num;}}public class Example3 {public Test test(){ Test t = new Test(0); try{t.setNum(10);return t;}catch(Exception e){t.setNum(20);return t;}finally{t.setNum(30);}}/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println(new Example3().test().getNum());}} 打印結(jié)果例如以下: 30 從上述結(jié)果來看,finally操作的對(duì)象確實(shí)是與try上的同一個(gè)對(duì)象。那么我們比較上面觀點(diǎn)三,操作變量的時(shí)候是不能更改的,想想有點(diǎn)詭異。我們看以下代碼: package java_zhaohuaxishi;class Test{int num; public Test(int num){this.num = num; }public int getNum() {return num;}public void setNum(int num) {this.num = num;}}public class Example3 {public int test(){Test t = new Test(0);try{t.setNum(10);System.out.println(t.getNum());return t.getNum();}catch(Exception e){t.setNum(20);return t.getNum();}finally{System.out.println(t.getNum());t.setNum(30);}}/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println(new Example3().test());}} 這次我們不在返回對(duì)象。而是返回一個(gè)int變量。從觀點(diǎn)一我們能夠知道,返回的t.getNum()實(shí)際上是會(huì)先計(jì)算再保存起來。那么假設(shè)我們?cè)趂inally中在去改變t的num,實(shí)際上t的num會(huì)被改變,然而返回的應(yīng)該還是10。 打印結(jié)果例如以下: 10 30 10 果然!這與我們預(yù)先的是一模一樣。假設(shè)有人認(rèn)為finally中t對(duì)象可能與try中不一致。以下樣例將會(huì)讓你認(rèn)為非常奇妙: package java_zhaohuaxishi;class Test4{int num;public Test4(int num){this.num = num; }public int getNum() {return num;}public void setNum(int num) {this.num = num;}}public class Example4 {public Test4 test(Test4 t){ System.out.println("傳進(jìn)去的t:"+t.hashCode());try{t.setNum(10);return t;}catch(Exception e){t.setNum(20);return t;}finally{//t.setNum(30);System.out.println("finally改動(dòng)前:"+t.hashCode());t = new Test4(0);System.out.println("finally改動(dòng)后:"+t.hashCode());//return t;}}/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubTest4 t = new Test4(0);System.out.println("return返回對(duì)象"+new Example4().test(t).hashCode());System.out.println("最后的t:"+t.hashCode());}} 我們來看看打印結(jié)果: 傳進(jìn)去的t:2004703190 finally改動(dòng)前:2004703190 finally改動(dòng)后:1175576547 return返回對(duì)象2004703190 最后的t:2004703190這結(jié)果看起來非常奇妙。我們驗(yàn)證觀點(diǎn)四的時(shí)候操作對(duì)象是起作用的!然而當(dāng)我們?cè)噲D去改動(dòng)t引用讓他指向其它對(duì)象的時(shí)候居然無效......
如有很多其它興趣深入了解。可進(jìn)一步認(rèn)識(shí)JVM工作機(jī)制!



















轉(zhuǎn)載于:https://www.cnblogs.com/blfbuaa/p/6915692.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的朝花夕拾——finally/final/finalize拨云雾见青天的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。