呵呵!還是先給大家出個題吧!
public class PreferenceTest {</p><p>public int testVar = 0;</p><p>/**<br /> * create data: 2009-12-30</br> Just for me to test preference.<br /> *<br /> * @author XiangJie<br /> * @param args<br /> *<br /> */<br />public static void main(String[] args) {<br />// TODO Auto-generated method stub<br />PreferenceTest test1 = new PreferenceTest();<br />test1.testVar = 10;<br />PreferenceTest test2 = test1;<br />test2.testVar = 5;<br />test1 = null;<br />System.out.println(test2.testVar);<br />}</p><p>}
請問列印結果是什麼?
下面我來分析一下這個問題,和以前一樣先不給出答案啊!
要討論這個問題,就首先要瞭解JAVA對象和引用的關係,以及堆棧的儲存關係!
以這個例子來討論:PreferenceTest test1 = new PreferenceTest();在初始化的時候,首先是在堆中new出一片地區用於儲存物件,也就是說對象是儲存在堆中的,而PreferenceTest test1 只是一個引用,它存在與棧中,“=”的目的是讓這個引用指向對應的對象,
。理清了這些關係我們來討論結果到底是什麼,首先是引用test1指向已經初始化的Object(對象),然後,test1.testVar=10的意思就是通過這個引用拿到object,再將它的變數testVar賦值為10,而PreferenceTest test2 = test1是指引用test2通過引用test1拿到object,也就是說現在object有兩個引用指向它,test2.testVar=5實質上還是在操作當前的object,現在它的變數testVar賦值為5了,現在最關鍵的也就是test1=null,這句的意思是什麼呢?其實很簡單,將它的引用指向空(null),而並不是說當前的object變為null了,通過這一句,其實在棧中只有test2指向當前的object,答案也就出來了。
列印的結果為:5
大家也許會覺的這些都是小兒科,其實當真正遇到這個問題的時候,大家會發現往往是最基礎的問題把你給欄注了。
下面給大家說一下在項目中實實在在遇到的問題:
開發過eclipse的朋友也許遇到過No more handles Exception ,引起這個exception的具體原因以及該怎麼解決以後在講,現在只是簡單的說一下,其實SWT與JAVA的一個區別說造成的,java有一套完整的記憶體回收機制,所以我們不用擔心記憶體回收的問題,而在SWT中的很多個物件有一個dispose方法,這個方法就是用於釋放對象的,只不過是它已經處理了很多實作類別,但是有一種資源它沒有處理過,那就是Resource對象,這個有點類似於C++,你要手動的去釋放這些資源,否則的話它是一直存在與記憶體中的,導致的結果就是對象越來越多,而eclipse能夠handle的對象是有限的,我記得好像是5000多個,如果太多的話就會拋出這個異常了。
下面來帖一下解決的代碼(其中Color就是Resource的子類):
Color tempBgColor = bgColor;<br />bgColor = ColorChangeTool.mapStringToColor(model.getBackground());</p><p>((Label) getFigure()).setBackgroundColor(bgColor);</p><p>tempBgColor.dispose();
這幾句代碼就巧妙應用到了引用和對象的轉換。釋放了之前已經存在的對象,而重新設定新的對象!
更多精彩:http://www.eclipselight.org/swt-jface/168/