Java基礎——final 一成不變不可變?

final可以修飾類,方法,變量。

一、final和類

  • final修飾類不可以被繼承。
  • final 類的 方法 自動地聲明為 final,但是實例變量并不是 final。

二、final和屬性

  • final修飾的變量稱為常量,這些變量只能賦值一次,final 的變量不能被修改
  • final修飾的引用類型變量,表示該變量的引用不能變,而不是該變量的值不能變;
  • 內(nèi)部類在局部時,只可以訪問被final修飾的局部變量。

證明1: final修飾的變量稱為常量,這些變量只能賦值一次,final 的變量不能被修改

public class FinalTry {
    final int finaVar = 18;
    int norVar = 22;
    void showVar(){
        System.out.println("finaVar 1: "+ finaVar);
        finaVar = 19;
        norVar = 23;
    }
}
image.png

.
.

證明2: final修飾的引用類型變量,表示該變量的引用不能變,而不是該變量的值不能變;

Java中的String類是聲明為final的,一旦建立String對象之后它的值的內(nèi)容是無法修改的,任何看上去是對String對象的值的修改都只是改變String對象的引用,但是StringBuffer類彌補了String類的不足,StringBuffer類的內(nèi)容可以修改。
StringBuilder 在api的定義是:

public final class StringBuilder
     extends AbstractStringBuilder
     implements java.io.Serializable, CharSequence 

也是final,
區(qū)別是:
String是不可變類,一旦String對象被創(chuàng)建,包含在對象中的字符序列是不可變的,直到對象被銷毀
StringBuffer 與 StringBuilder對象則是可變的,不用每次新建對象,效率高!

public class FinalTry {
     public static void main(String[] args) {  
            final StringBuilder sb = new StringBuilder("haha");  
            StringBuilder sbChange = new StringBuilder("hehe");  

            //同一對象的hashCode值相同  
            System.out.println("sb中的內(nèi)容是:"+sb);  
            System.out.println(sb+"的哈希編碼是:"+sb.hashCode());  
            sb.append("值改變了");  
            System.out.println("sb中的內(nèi)容是:"+sb);  
            System.out.println(sb+"的哈希編碼是:"+sb.hashCode()); 
            
         // sb = sbChange; 這句代碼會報錯,因為sb是final的,如果把sb的final去掉那么就不報錯
              
            System.out.println("-----------------哈希值-------------------");  
            FinalTry test = new FinalTry();  
            System.out.println(test.hashCode());  
            System.out.println(Integer.toHexString(test.hashCode()));  
            
            System.out.println(test.toString());  
            System.out.println(test.getClass()+"@"+Integer.toHexString(test.hashCode()));  
            System.out.println(test.getClass().getName()+"@"+Integer.toHexString(test.hashCode()));  
            //在API中這么定義toString()等同于 getClass().getName() + '@' + Integer.toHexString(hashCode())  
            //返回值是 a string representation of the object.  
        }
}

輸出:

sb中的內(nèi)容是:haha
haha的哈希編碼是:2018699554
sb中的內(nèi)容是:haha值改變了
haha值改變了的哈希編碼是:2018699554
-----------------哈希值-------------------
1311053135
4e25154f
FinalTry@4e25154f
class FinalTry@4e25154f
FinalTry@4e25154f

二、final和方法

final修飾的方法不可以被覆寫

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內(nèi)部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,767評論 18 399
  • (一)Java部分 1、列舉出JAVA中6個比較常用的包【天威誠信面試題】 【參考答案】 java.lang;ja...
    獨云閱讀 7,142評論 0 62
  • 這個系列面試題主要目的是幫助你拿輕松到offer,同時還能開個好價錢。只要能夠搞明白這個系列的絕大多數(shù)題目,在面試...
    獨念白閱讀 352評論 0 3
  • 集合框架: 1)特點:存儲對象;長度可變;存儲對象的類型可不同2)Collection(1)List:有序的;元素...
    Demo_Yang閱讀 1,286評論 0 4
  • 本文出自 Eddy Wiki ,轉載請注明出處:http://eddy.wiki/interview-java.h...
    eddy_wiki閱讀 1,227評論 0 5