国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

java final變量

2019-11-14 21:09:32
字體:
來源:轉載
供稿:網友
java final變量

final變量定義: 變量一經初始化就不能指向其它對象。指向的存儲地址不可修改,但指向的對象本身是可以修改的。先說final變量初始化:很多文章都這么說:其初始化可以在兩個地方,一是其定義處,二是在構造函數中,兩者只能選其一。胡說八道!final變量可以在任何可以被始化的地方被始化,但只能被初始化一次.一旦被初始化后就不能再次賦值(重新指向其它對象),作為成員變量一定要顯式初始化,而作為臨時變量則可以只定義不初始化(當然也不能引用)即使是作為一個類中的成員變量,也還可以在初始化塊中初始化,所以"其初始化可以在兩個地方,一是其定義處,二是在構造函數中,兩者只能選其一"是錯誤的.作為成員變量時,final字段可以設計不變類,是不變類的一個必要條件但不是一個充要條件.至少可以保證字段不會以setXXX()這樣的方式來改變.但無法保證字段本身不被修改(除非字段本身也是不變類);對于方法參數的final變量:對于方法參數的變量定義為final,90%以上的文章都說"當你在方法中不需要改變作為參數的對象變量時,明確使用final進行聲明,會防止你無意的修改而影響到調用方法外的變量。"胡說八道!我不知道這個修改是說重新賦值還是修改對象本身,但無論是哪種情況,上面的說法都是錯誤的.如果是說重新賦值,那么:public static void test(int[] x){ x = new int[]{1,2,3};} int[] out = new int[]{4,5,6}; test(out); System.out.PRintln(out[0]); System.out.println(out[1]); System.out.println(out[2]); 調用test(out);無論如何也不會影響到外面變量out.你加不加final根本沒有意義.final只會強迫方法內多聲明一個變量名而已,即把x = new int[]{1,2,3};改成int y = new int[]{1,2,3}; 其它沒有任何實際意義. 如果說是修改對象本身:public static void test(final int[] x){ x[0] = 100;} int[] out = new int[]{4,5,6}; test(out); System.out.println(out[0]);難道你用final修飾就不可以修改了?所以說對于方法參數中final是為了不影響調用方法外的變量那是胡說八道的.那我們到底為什么要對參數加上final?其實對方法參數加final和方法內變量加上final的作用是相同的,即為了將它們傳給內部類回調方法:abstract class ABSClass{public abstract void m();}現在我們來看,如果我要實現一個在一個方法中匿名調用ABSClass.應該:public static void test(String s){ //或String s = ""; ABSClass c = new ABSClass(){ public void m(){ int x = s.hashCode(); System.out.println(x); } }; //其它代碼.}注意這里,一般而言,回調方法基本上是在其它線程中調用的.如果我們在上面的 ABSClass c = new ABSClass(){ public void m(){ int x = s.hashCode(); System.out.println(x); } }; 后面直接調用c.m();應該是沒有意義的.但這不重要,重要的是只要有可能是在其它線程中調用,那我們就必須為s保存引用句柄.我們先來看GC工作原理,JVM中每個進程都會有多個根,每個static變量,方法參數,局部變量,當然這都是指引用類型.基礎類型是不能作為根的,根其實就是一個存儲地址.GC在工作時先從根開始遍歷它引用的對象并標記它們,如此遞歸到最末梢,所有根都遍歷后,沒有被標記到的對象說明沒有被引用,那么就是可以被回收的對象(有些對象有finalized方法,雖然沒有引用,但JVM中有一個專門的隊列引用它們直到finalized方法被執行后才從該隊列中移除成為真正沒有引用的對象,可以回收,這個與本主題討論的無關,包括代的劃分等以后再說明).這看起來很好.但是在內部類的回調方法中,s既不可能是靜態變量,也不是方法中的臨時變量,也不是方法參數,它不可能作為根,在內部類中也沒有變量引用它,它的根在內部類外部的那個方法中,如果這時外面變量重指向其它對象,則這個對象就失去了引用,可能被回收,而由于內部類回調方法大多數在其它線程中執行,可能還要在回收后還會繼續訪問它.這將是什么結果?而使用final修飾符不僅會保持對象不會改變,而且編譯器還會持續維護這個對象在回調方法中的生命周期.所以這才是final變量和final參數的根本意義.


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新疆| 钦州市| 恩施市| 卢龙县| 沙雅县| 平原县| 文山县| 康定县| 肇庆市| 湖口县| 文化| 吉水县| 来安县| 庆云县| 政和县| 巴林右旗| 石泉县| 日喀则市| 吴川市| 忻城县| 太谷县| 丰宁| 清新县| 增城市| 永年县| 闽清县| 吴忠市| 龙岩市| 上饶市| 平阳县| 建水县| 西藏| 乌拉特前旗| 河北省| 靖安县| 门源| 余干县| 北海市| 察哈| 张家口市| 察雅县|