1. 程式人生 > >【一道面試題】使用 final 關鍵字修飾一個變數時,是引用不能變,還是引用的物件不能變?

【一道面試題】使用 final 關鍵字修飾一個變數時,是引用不能變,還是引用的物件不能變?

剛看到這道題時,自己也是有點懵逼的,也不清楚答案,便趕緊去百度final的用法,然後看了很多回答和例項才只知道了答案!
首先我們來看下 final關鍵字的用法,然後再來回答這道題!
1.final 關鍵字可以用來修飾 類,方法和變數(成員變數和區域性變數)
那麼我們來討論下,final關鍵字幾種用法

  • 修飾類
    final修飾類時,說明該類你不想被別人繼承!一個類不被別的類繼承就可以使用final來修飾,測試結果如下圖
    這裡寫圖片描述
    注意 final類中的所有成員方法都會被隱式地指定為final方法。

  • 修飾方法
    當一個方法被final修飾後,就代表該方法無法被重寫,如果你想明確禁止 該方法在子類中被覆蓋的情況下才將方法設定為final的,可以看下圖示例
    這裡寫圖片描述


    你就無法重寫該方法了,但是!同時注意 如果父類的 final修飾的方法設定為private,則子類可以寫一個同名的方法,此時 ,該同名的方法不再產生final的報錯,而是在子類重新定義了一個方法(注:類的private方法會隱式地被指定為final方法。)見下圖
    這裡寫圖片描述

  • 修飾變數
    這裡就是比較重要的點了,也和我們開頭說的那道面試題有很大的關係,理解了這個,就不難理解這道面試題的答案了
    被final修飾的變數其實就相當於定義了一個常量,無法被修改的變數,如果final修飾的是一個基本資料型別的變數,那麼這個變數的值就定了,不能變了,而如果修飾的是一個引用變數,那麼該變數存的是一個記憶體地址,該地址就不能變了,但是該記憶體地址所指向的那個物件還是可以變的,就像你記住了人家的門牌號,但你不能管人家家裡人員數量,有個例子 看下圖
    這裡寫圖片描述


    但是你可以改那個物件的內容!見下圖
    這裡寫圖片描述

還有的人給方法定義的引數是 final型別的,是不想別人在方法內部修改引數的值,如果final修飾的是一個基本型別,那麼是可以的,如果修飾的是引用型別,那麼便不行了,因為就如上文那個str.append 物件的內容是可以變化的!