1. 程式人生 > >final修飾的變數是引用不能改變還是引用的物件不能改變

final修飾的變數是引用不能改變還是引用的物件不能改變

我們都知道final修飾變數時 會變為常量,但是使 用final關鍵字修飾一個變數時,是引用不能變,還是引用的物件不能變?

下面讓我們來看這段程式碼:

/**
 * 驗證final修飾的變數是引用不能變,還是引用的物件不能變
 * StringBuilder 執行緒不安全 但速度快
 * 引用初始化以後不能被改變 --- 不是指變數的值不可變,而是指向的變數地址不可變
 * @author Tomato
 *
 */
public class TestFinal {
	public static void main(String[] args) {
		final StringBuilder sb = new StringBuilder("haha");
		//同一物件的hashCode值相同
		System.out.println("sb中的內容是:"+sb);
		System.out.println(sb+"的雜湊編碼是:"+sb.hashCode());
		sb.append("我變了");
		System.out.println("sb中的內容是:"+sb);
		System.out.println(sb+"的雜湊編碼是:"+sb.hashCode());
		

		System.out.println("-----------------雜湊值-------------------");
		TestFinal test = new TestFinal();
		System.out.println(test.hashCode());
		System.out.println(Integer.toHexString(test.hashCode()));
		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.
		System.out.println(test.toString());
	}
}
程式碼結果是:

sb中的內容是:haha
haha的雜湊編碼是:1928052572
sb中的內容是:haha我變了
haha我變了的雜湊編碼是:1928052572
-----------------雜湊值-------------------
1398828021
53606bf5
class [email protected]
[email protected]
[email protected]

可以看出StringBuilder中的內容變了 而所指向的雜湊編碼卻沒發生變化,在Java中每一個物件都有自己獨一無二的雜湊編碼,根據這個編碼就可以找到相關的物件,也就是說,根據這個編碼你可以獨一無二地確定這個物件。


因而使用final關鍵字修飾一個變數時,是指引用變數不能變,引用變數所指向的物件中的內容還是可以改變的。

總得來說對於一個final變數,如果是基本資料型別的變數,則其數值一旦在初始化之後便不能更改;如果是引用型別的變數,則在對其初始化之後便不能再讓其指向另一個物件。

相關推薦

final修飾變數引用不能改變還是引用物件不能改變

我們都知道final修飾變數時 會變為常量,但是使 用final關鍵字修飾一個變數時,是引用不能變,還是引用的物件不能變? 下面讓我們來看這段程式碼: /** * 驗證final修飾的變數是引用不能變,還是引用的物件不能變 * StringBuilder 執行緒不安全

final修飾引用變數變數所指物件的屬性是否能改變!!

請在下面的程式中找出錯誤的位置!!! package com.bdqn.cc.polymorphic; public cl

Java中Final修飾一個變數時,是引用不能變還是引用物件不能變

Java中,使用Final修飾一個變數,是引用不能變,還是引用物件不能變?   是引用物件的地址不能變,引用變數所指的物件的內容可以改變。   final變數永遠指向這個物件,是一個常量指標,而不是指向常量的指標。   比如: final StringBuffer sb=new Stri

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

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

內部類引用外部類的區域性變數要用final修飾

為什麼內部類引用外部類的區域性變數時,此變數要用final修飾 程式碼    public void test() {        final int i = 3;        run

對內部類引用外部方法變數需用final修飾的理解

  Last modified 2015-12-14; size 569 bytes  MD5 checksum d52c1f747d7b708cb19cd659e3d5d9ac  Compiled from "JavaDemo.java"class JavaDemo$1 extends JavaDemo$I

final修飾的變量引用不能變還是對象不可變

報錯 -- class new http 基本 賦值 技術 ati 兩種情況:如果是基本數據類型,被final修飾的變量一旦初始化就不能改變;如果是引用數據類型的變量,初始化之後不能只想另外一個對象。 基本數據類型: package cn.yqg.day2; publi

返回一個臨時變數的右值引用,那麼臨時物件什麼時候釋放?

最近在研究右值引用的時候碰到這個問題,還沒有解決,將問題貼在這裡,待更新: const int* printAddress(const int & v) { cout << v << endl; cout <<

final、static、static final修飾引用型別時的區別

總結: final修飾的引用型別:是在堆記憶體new出來的;(如物件)可以被賦值一次,引用地址不可變,但物件裡面的內容(如屬性值)可以變。 static修飾的引用型別:是在載入類的時候,load到方法區的;是這個類的例項共有的類方法or屬性;引用的地址可以變,裡面具體的內容

const修飾符的使用(修飾結構體指標,引用外部的const 變數

const修飾符的使用 //const修飾變數為只讀 const int a = 10; a = 20;//是錯誤的賦值 //指標變數 指標指向的記憶體 兩個不同的概念 char buf[]

關於父類引用指向子類物件

以下內容參考https://www.cnblogs.com/ChrisMurphy/p/5054256.html 父類引用指向子類物件指的是: 例如父類Animal,子類Cat,Dog。其中Animal可以是類也可以是介面,Cat和Dog是繼承或實現Animal的子類。 Animal animal =

Golang對方法接收者變數的自動“取引用”和“解引用

1. 寫在前面 文章的標題讀起來是有點拗口的,用一個簡單的示例大家便可以一目瞭然了,如下所示,st2會被自動解引用從而呼叫StructTest的printData方法,而st3會被自動取引用從而呼叫StructTest2的printData方法。 但很多時候,我們會發現這種自動的“取

JavaScript引用型別中Math物件相關介紹

Math物件在實際應用中作用感覺得到,當然引用型別的這些方法不可能去一一列舉出來我們只有邊用邊記憶才比較好,那麼小編這邊相當於是給自己做上一個筆記,介紹一些Math中自己覺得用得上的方法。 ·我們這樣去理解math方法,實際用法上他不像Array類那樣要去先建立一個物件在對物件應用相關方法,更多

對於類裡面例項變數和函式的引用

class Car(): def __init__(self,make,model,year): self.make=make self.model=model self.year=year def get_name(self):

043_面向物件_16_修飾變數

一、final關鍵字的用法   1.final修飾變數:被final修飾的變數不可改變。即初始化一次後,就不能再次被賦值!即,變為常量!如、final  int MAX_VALUE=200;那麼以後程式就不能改變MAX_VALUE的值。   2.final修飾方法:被final修飾的方法不能被子

final修飾的值真的不能改變嗎?

首先,final可以修飾基本型別的變數,也可以修飾引用型別。 那麼,final修飾的變數的值真的不可以改變嗎?先看下面的程式碼: class Test { public static void main(String[] args) { A a=new Test().n

淺談final修飾變數

一直大概的知道final關鍵字的作用,但是自己實際工作中卻很少用,除非在宣告一些常量值的時候,今天忽然自己在專案中用一個map進行儲存一些值。一開始我只是用private修飾的,心裡想的是如果final修飾的話,應該不能修改了。畢竟被final修飾的變數不可變。今天回家後,做了下面的嘗試,徹底暴露出自己基礎

匿名內部類可以訪問的變數---靜態成員變數final修飾的區域性變數

  在學習多執行緒的時候用到了匿名內部類,匿名內部類可以訪問static靜態成員變數或者final修飾的區域性變數。   匿名內部類在編譯之後會生成class檔案,比如Test內的第一個匿名內部類編譯之後就是Test$1.class;   匿名內部類中訪問的final修飾的區域性變數在生成Test$1.c

【shell】1、變數的宣告、引用及作用域

shell程式 以檔案形式存放==批量的Linux命令集合==,該檔案能夠被Shell解釋執行,這種檔案就是Shell指令碼程式 通常由一段Liunx命令、Shell命令、控制語句以及註釋語句構成 Shell指令碼的編寫 Shell指令碼是純文字檔案,可以使用任何文字編輯器編寫

java-final關鍵字修飾變數

       在java中,final關鍵字可以對類、方法以及變數進行修飾,這裡對final修飾變數進行一些探討。        final修飾的變數不可更改,其不可更改指的是其引用不可修改。看下列程式碼: StringBuffer sb1 = new StringBuf