1. 程式人生 > >final關鍵字的一些作用

final關鍵字的一些作用

本文字不想寫,為了第4點而寫

1.父類不可被繼承

2.父類方法不可被重寫

3.final提升基礎資料型別到執行時常量池裡

4.方法中,final指向的東西,匿名內部類也可以進行訪問

第四點重點講一下

void test(final Object o) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            Log.i(TAG, o.toString());
        }
    }).start();
}

這個o是外面傳進來的,可能是在堆中分配的物件,也可能是如下

void test() {
    final Object o = new Object();
    new Thread(new Runnable() {
        @Override
        public void run() {
            Log.i(TAG, o.toString());
        }
    }).start();
}

這個o是臨時建立的

通過這兩個程式碼想說明,物件就這兩種來源,都是建立在堆中的(而非異想天開地在棧幀的區域性變量表中建立)。

我們的區域性變量表只是有這樣一個引用

引用名 記憶體地址

---------------------------

o          e9879862dw

大概是這樣的。但是為何匿名內部類只能訪問加了final後的物件引用呢?

只有一個可能:

Java語法認為,這個匿名內部類的方法不一定何時會被呼叫,不一定一直像這樣

void test() {
    final Object o = new Object();
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            Log.i(TAG, o.toString());
        }
    };
    runnable.run();
}

直接就呼叫了。更多的是像這樣

void test() {
    final Object o = new Object();
    new Thread(new Runnable() {
        @Override
        public void run() {
            Log.i(TAG, o.toString());
        }
    }).start();
}

在這個方法結束後才被呼叫。

在方法結束後自然要進行棧幀的出棧,區域性變量表的reset,所以匿名內部類拿到的引用,其指向會被賦值為空!這就會造成空指標異常。

所以為了既規避空指標異常,又能及時回收棧幀、區域性變量表,我們需要final關鍵字

有了final關鍵字,引用將會恆定地指向物件所在的記憶體區域。

這才是可信賴的,寶貝。

相關推薦

淺談static ,final 關鍵字作用

一 、java中的關鍵字static 是在編寫程式碼和閱讀程式碼時碰到的比較難以理解的一個關鍵字,在平常的面試當中也是面試官常問到的一個問題,下面 就 static 關鍵字 講解三點它常見的問題  1、static關鍵字的用途 在《Java程式設計思想》P86頁有

單例餓漢模式中final關鍵字作用

原文: http://www.tuicool.com/articles/2Yjmqy 併發程式設計網:http://ifeve.com/java-memory-model/ 總結: Final 變數在併發當中,原理是通過禁止cpu的指令集重排序(重排序詳解http://ifeve.com/java-mem

Android Java中的static與final關鍵字作用

static  1. static變數     按照是否靜態的對類成員變數進行分類可分兩種:一種是被static修飾的變數,叫靜態變數或類變數;另一種是沒有被static修飾的變數,叫例項變數。兩者的區別是:    對於靜態變數在記憶體中只有一個拷貝(節省記憶體),JVM

final關鍵字一些作用

本文字不想寫,為了第4點而寫 1.父類不可被繼承 2.父類方法不可被重寫 3.final提升基礎資料型別到執行時常量池裡 4.方法中,final指向的東西,匿名內部類也可以進行訪問 第四點重點講一下 void test(final Object o) {

深入理解final關鍵字以及一些建議

重新 -i 想是 .class tro orm print 靜態工廠方法 給他 引子:一說到final關鍵字,相信大家都會立刻想起一些基本的作用,那麽我們先稍微用寥寥數行來回顧一下。 一、final關鍵字的含義 final是Java中的一個保留關鍵字,它可以標記在成員變量、

static、final、transient等關鍵字作用

static static表示“全域性”或者“靜態”的意思,用來修飾成員變數和成員方法,也可以形成靜態static程式碼塊 被static修飾後的成員,在編譯時由記憶體分配一塊記憶體空間,直到程式停止執行才會釋放,那麼就是說該類的所有物件都會共享這塊記憶體空間

java中 static,final,transient,volatile關鍵字作用

static 和final   static  靜態修飾關鍵字,可以修飾 變數,程式塊,類的方法;  當你定義一個static的變數的時候jvm會將將其分配在記憶體堆上,所有程式對它的引用都會指向這一個地址而不會重新分配記憶體; 修飾一個程式塊的時候(也就是直接將程式碼寫在

總結java中static、final、transient關鍵字作用

1. transient使用1)被transient關鍵字修飾的變數不再能被序列化,一個靜態變數不管是否被transient修飾,均不能被序列化。2)一旦變數被transient修飾,變數將不再是物件持久化的一部分,該變數內容在序列化後無法獲得訪問。3)transient關鍵

java final關鍵字作用

1.final修飾類的時候,這個類不能被不能被繼承,但是裡面的成員變數可以被修改 2.fianl修飾方法時。這個方法不能被重寫 3.final修飾變數時這個變數是常量不能被修改,而且使用這個變數時,必

final關鍵字 修飾引數的作用

在方法引數前面加final關鍵字就是為了防止資料在方法體中被修改。 主要分兩種情況:第一,用final修飾基本資料型別;第二,用final修飾引用型別。 第一種情況,修飾基本型別(非引用型別)。這時引數的值在方法體內是不能被修改的,即不能被重新賦值。否則編譯就通不過。例如: 1 public static

關於 final 關鍵字一些總結

final關鍵字主要用在三個地方:變數、方法、類 1.對於一個final變數,如果是基本資料型別的變數,則其數值一旦在初始化後便

(轉)final關鍵字的深入理解

多線程 body error app nds ann this tar order 轉自http://www.importnew.com/7553.html Java中的final關鍵字非常重要,它可以應用於類、方法以及變量。這篇文章中我將帶你看看什麽是final關鍵字?將

JAVA中的final關鍵字

code out 繼承 style 事物 不能 void show 內部 final:最終 ,作為一個修飾符 可以修飾類,函數,變量 被final修飾的類不可以被繼承,為了避免被子類復寫功能 被final修飾的方法不能被復寫 被final修飾的變量是一個常量。只能被賦值一

final關鍵字

地址 不能 子類 spa ati string 引用數據類型 限定 子類重寫 1.final關鍵字可以修飾屬性、方法、類 2.final關鍵字修飾的類不能被繼承,如:String類 3.final關鍵字修飾方法,不能在被子類重寫 4.fina

面對對象-final關鍵字

賦值 nal style 修飾 基本 str 無法 fin color final修飾符基本變量--->常量,運行的過程中無法重新賦值 final修飾符引用變量--->運行的過程中無法重新指向新對象,但是可以修改引用對象的屬性 final修飾符方法--->

java學習(六)面向對象 final關鍵字

hello int java學習 xtend 最終 .sh 方法 div ext 1.被fnial修飾的方法不能被重寫,常見的為修飾類,方法,變量 /* final可以修飾類,方法,變量 特點: final可以修飾類,該類不能被繼

5.4-全棧Java筆記:面向對象進階之對象的轉型 | FINAL關鍵字 |抽象方法和抽象類

java對象的轉型(casting)引用變量只能調用它編譯類型的方法,不能調用它運行類型的方法。這時,我們就需要進行類型的強制轉換!【示例1】對象的轉型public class TestCasting { public static void main(String[] args) {

JAVA關鍵字作用

加載 結合 便在 數據類型 同名 div bsp sync 修飾符 Java關鍵字及其作用 一、 總覽: 訪問控制 private protected public 類,方法和變量修飾符 abstract class extends

Final關鍵字和類的自動加載

使用 可變 自動 lin 關鍵字 修飾 我們 pan tle Final關鍵字: 父類中的方法被聲明為 final,則子類無法覆蓋該方法。如果一個類被聲明為 final,則不能被繼承。 一般是為了防止父類的一個方法被重寫。只能用來定義類和定義方法, 不能使用final這個關

php Final關鍵字

erro ron ide pro test eth ror example bsp PHP 5 新增了一個 final 關鍵字。如果父類中的方法被聲明為 final,則子類無法覆蓋該方法。如果一個類被聲明為 final,則不能被繼承。 Example #1 Final