【零基礎(chǔ) 快速學(xué)Java】韓順平 零基礎(chǔ)30天學(xué)會(huì)Java

對(duì)于String類來說,保存字符內(nèi)容的屬性是private final char[] value,該屬性被private修飾,無法在外部修改其值,又被final修飾,value數(shù)組的引用無法被更改。外部采用String str = new String("1234");個(gè)人理解創(chuàng)建對(duì)象步驟為1.現(xiàn)在堆中開辟空間0X11用str指向該空間。2.在0X11中在開辟空間0X22,來表示value數(shù)組的地址。3.在常量池里開辟空間0X33表示字符串1234的空間,用value數(shù)組指向該空間。如圖:

所以如果要修改str的值有兩種方式1.重新new一個(gè)字符串對(duì)象,那么原來的對(duì)象由于沒有引用指向,就被JAVA的垃圾回收機(jī)制回收,str指向新的對(duì)象,value就是新的value,但是在常量池里的常量并未改變。2.通過常量池給str對(duì)象賦值,那么就不會(huì)再堆中開辟空間,而是判斷常量池中是否要該字符串常量,如果沒有在常量池中開辟一段空間來存放,在將str對(duì)象指向該空間。
特別注意:關(guān)于屬性value,可能有同學(xué)還是沒有弄懂到底是什么不能改,看以下例子:
final char[] value ={ 'a','b','c'}; char v[] ={ 't','o','m'}; value = v;//Cannot assign a value to final variable 'value' value[0] = 'h';
可以看到將value數(shù)組指向v數(shù)組時(shí),會(huì)報(bào)出不能給final變量value賦值,但是value[0] = 'h'是可以的,所以value的地址不能改變但是值可以改變。但是在String類里面value是被private修飾的外部無法訪問,所以我們不能像上面這個(gè)例子一樣修改value的值! 所以對(duì)String對(duì)象來說,當(dāng)我們重新指向新的內(nèi)容時(shí),其實(shí)本質(zhì)上是開辟了新的空間,指向了新的對(duì)象。