java值引用和對象引用 Java對象使用后設(shè)置為null會減少內(nèi)存占用嗎?
Java對象使用后設(shè)置為null會減少內(nèi)存占用嗎?首先,Java對象是引用變量,它使用兩種內(nèi)存區(qū)域:堆內(nèi)存和堆棧內(nèi)存。Java對象存儲在堆內(nèi)存中,對它們的引用(理解為變量)存儲在堆棧內(nèi)存中。例如,st
Java對象使用后設(shè)置為null會減少內(nèi)存占用嗎?
首先,Java對象是引用變量,它使用兩種內(nèi)存區(qū)域:堆內(nèi)存和堆棧內(nèi)存。Java對象存儲在堆內(nèi)存中,對它們的引用(理解為變量)存儲在堆棧內(nèi)存中。
例如,string STR=new string(“string”)使用兩段內(nèi)存,new string(“string”)存儲在堆內(nèi)存中,STR變量存儲在堆棧內(nèi)存中。
當(dāng)我們將對象設(shè)置為null(即:STR=null)時,STR變量與堆內(nèi)存中的數(shù)據(jù)斷開連接。GC算法會在必要時回收STR和堆內(nèi)存中的對象,但是我們不能干預(yù)GC的任何回收。
.GC將在正確的時間回收垃圾數(shù)據(jù)。
java用類創(chuàng)建一個對象什么時候用new什么時候不用?
看樓上的答案,專門寫代碼測試,結(jié)果發(fā)現(xiàn)execsql似乎不是靜態(tài)方法。
Java對象在堆上分配了內(nèi)存,因此請使用new。Sqlitedatabase只聲明一個對象引用而不進行初始化。打電話給數(shù)據(jù)庫.execSQL(SQL)應(yīng)報告錯誤。如果初始化為sqlitedatabase=null,則直接在下面調(diào)用時將出現(xiàn)空指針異常。因為這個引用沒有指向一個對象。靜態(tài)方法和靜態(tài)成員變量確實不使用實例化對象,例如整數(shù).toString(10) 可以直接使用。
為什么說java里面只有值傳遞?
在這個問題上,不同的人有不同的理解。對于Java初學(xué)者來說,他們可能認為Java中的參數(shù)傳遞分為值傳遞和引用傳遞。至于為什么,教科書上說了。對于程序員的某些工作年限,他們可能會認為,如果傳遞的參數(shù)類型是普通類型,則傳遞的是值;如果參數(shù)是對象,則傳遞的是引用。另一些人認為,只有Java中的值傳遞才是主要問題的主題。
對于Java編程語言,前兩種理解是錯誤的。Java中只使用值傳遞。對我來說,一開始,我也理解了價值傳遞和參照傳遞的理論,但隨著自己代碼的積累,我逐漸發(fā)現(xiàn)事實并非如此。那么為什么只有價值傳遞呢?
首先,讓我們了解什么是值傳遞,什么是引用傳遞?
值傳輸意味著調(diào)用函數(shù)時,實際參數(shù)值被復(fù)制并傳遞給被調(diào)用函數(shù)。修改被調(diào)用函數(shù)中的參數(shù)值不會影響原始參數(shù)值。
引用傳遞意味著調(diào)用函數(shù)時,實際參數(shù)的地址直接傳遞給被調(diào)用函數(shù)。修改被調(diào)用函數(shù)中的參數(shù)值將影響原始參數(shù)值。
如果傳遞的參數(shù)類型是普通基本類型,則必須復(fù)制實際參數(shù)值并將其傳遞給形式參數(shù)。但是,當(dāng)參數(shù)類型是對象時,它也是復(fù)制的參數(shù)值,并將其傳遞給形式參數(shù)。只復(fù)制對象的引用地址,即內(nèi)存中分配的存儲地址,而不是直接傳遞的引用地址。
此時,有些人可能會問為什么一個對象會被傳遞給另一個方法。在此方法中修改對象的屬性值時,原始調(diào)用方法中對象的屬性值將更改。這不就是參考傳遞嗎?
事實上,這是一個非常令人困惑的問題。如果你仔細看看上面的說法,事實并非如此。將一個對象傳遞給另一個方法會傳遞什么?傳遞對象引用的地址。對象引用的地址是否已在其他方法中修改?原始對象引用是否受影響?不
!因此,Java中沒有引用傳遞,只有值傳遞。不要犯任何錯誤
未將對象引用設(shè)置到對象的實例是什么意思?
Java中的引用相當(dāng)于C語言中的指針,它沒有設(shè)置為對象的實例。也就是說,如果這個類沒有實例化,它就相當(dāng)于C語言中的一個野生指針。沒有實例化的引用不會創(chuàng)建內(nèi)存空間,并且在運行時會發(fā)生錯誤。例如,有一個名為student的類,然后編寫代碼:studentstu1studentstu1=newstudent()系統(tǒng)輸出打印(星期二)。Name)//這個句子會出錯,因為stu1沒有實例化,是空的系統(tǒng)輸出打?。?。Name)//這個句子是可以的,因為stu2已經(jīng)實例化了,有內(nèi)存空間,所以只要用new關(guān)鍵字實例化需要的類,就不會報錯。