本文目錄一覽:
java里的引用是啥意思?
說白了就是內存地址。
在Java中的引用類型,是指除了基本的變量類型之外的所有類型,所有的類型在內存中都會分配一定的存儲空間(形參在使用的時候也會分配存儲空間,方法調用完成之後,這塊存儲空間自動消失), 基本的變量類型只有一塊存儲空間(分配在stack中), 而引用類型有兩塊存儲空間(一塊在stack中,一塊在heap中), 方法形參的值傳遞(引用)是指形參和傳進來的參數指向同一個值的內存(heap)中;
java 中的引用是什麼意思?
在java實現某個功能的時候,會將類實例化成對象,然後jvm再對實例化後的對象進行操作。
實例化後的對象可以賦值,也可以引用。賦值時,java會開闢一個新的地址用於存放變量,而引用則不開闢地址。
String a = “a”;
String b = “a”;
將String類實例化成對象a與b,並賦值
String c = new String(“a”);
將c指向new出來的String型對象”a”
System.out.println(a==b);
System.out.println(a==c);
由於a與b都為對象賦值,打印出來的結果應該是true
而c是引用對象「a」,所以打印出來的結果應該是false
對象:一個類的具體實例化;
引用:對象的別名,使用該別名可以存放該對象,編譯器不會為引用分配空間,新對象與源對象共用一個存儲地址空間;引用的生命周期是它所引用的對象的生命周期,函數里返回一個局部對象的引用是很危險的
給你推薦一種最簡單的理解方式:引用就好比是給商品貼的標籤,你通過標籤可以拿到這個商品…….我開始就是這麼理解的,後來用多了就意會啦…..
java有幾種對象引用
1.強引用(StrongReference)
強引用是java中最常見的一種引用方式,當一個程序創建一個對象,並把這個對象賦給一個引用變量,程序通過該引用變量操作實際的對象.當一個對象被一個或一個以上的引用變量所引用時,它處於可達狀態,不可能被系統垃圾回收機制回收。
2.軟引用(SoftReference)
軟引用需要通過SoftReference類來實現,當一個對象只有軟引用時,它有可能被垃圾回收機制回收。對於只有軟引用的對象而言,當系統內存空間足夠時,它不會被系統回收,程序也可使用該對象;當系統內存空間不足時,系統可能會回收它。軟引用通常用於對內存比較敏感的程序中。
3.弱引用(WeakReference)
弱引用通過WeakReference類實現,弱引用和軟引用很像,但弱引用的引用級別更低。對於只有弱引用的對象而言,當系統垃圾回收機制運行時,不管系統內存是否足夠,總會回收該對象所佔用的內存。當然,並不是說當一個對象只有弱引用時,它就會立即被回收——正如那些失去引用的對象一樣,必須等到系統垃圾回收機制運行時才會被回收。
4.虛引用(PhantomReference)
虛引用通過PhantomReference類實現,虛引用完全類似於沒有引用。虛引用對對象本身沒有太大影響,對象甚至感覺不到虛引用的存在。如果一個對象只有一個虛引用時,那麼它和沒有引用的效果大致相同。虛引用主要用於跟蹤對象被垃圾回收的狀態,虛引用不能單獨使用,虛引用必須和引用隊列聯合使用
java中的引用數據類型是怎樣的?
java中有兩種數據類型:基本類型和引用類型。\x0d\x0a基本類型有8個:\x0d\x0a 整數類型 byte、short、int、long\x0d\x0a 浮點數類型 float、double\x0d\x0a 字符型 char\x0d\x0a 布爾類型 boolean\x0d\x0a引用類型包括三種:\x0d\x0a 類 Class\x0d\x0a 接口 Interface\x0d\x0a 數組 Array\x0d\x0a基本類型是通過諸如 int a = 5; long b = 6L;的形式來定義的,稱為自動變量,自動變量存放的是字面值,不是類的實例,它存放在內存的堆棧中,數據大小和生存期必須是確定的,存取速度比較快,在堆棧中的字面值可以共享,也就是說我們定義一個int a = 5;然後又定義了一個int b = 5;這時a與b在內存中指向的是同一個字面常量。\x0d\x0a引用類型一般是通過new關鍵字來創建,比如Integer num = new Integer(3);它存放在內存的堆中,可以在運行時動態的分配內存大小,生存期也不必事先告訴編譯器,當引用類型變量不被使用時,Java內部的垃圾回收器GC會自動回收走。引用變量中存放的不是變量的內容,而是存放變量內容的地址。\x0d\x0a在參數傳遞時,基本類型都是傳值,也就是傳遞的都是原變量的值得拷貝,改變這個值不會改變原變量,而引用類型傳遞的是地址,也就是參數與原變量指向的是同一個地址,所以如果改變參數的值,原變量的值也會改變。這點要注意。\x0d\x0a在java中,8種基本類型在java中都有對應的封裝類型,也就是引用類型:\x0d\x0a 整數類型 Byte、Short、Integer、Long\x0d\x0a 浮點數類型 Float、Double\x0d\x0a 字符型 Character\x0d\x0a 布爾類型 Boolean\x0d\x0a有時候我們會看到這樣的語句 Integer num = 3;Boolean b = true;這樣定義也能行得通,其實這裏面有一個自動裝箱的問題,即java自動把3這個字面常量封裝成了Integer對象,同理也有自動拆箱。\x0d\x0a還有些需要注意的比較特殊的地方:\x0d\x0a1.Integer類型\x0d\x0aInteger i1 = 3;\x0d\x0aInteger i2 = 3;\x0d\x0a此時i1 == i2 返回的是true\x0d\x0aInteger i1 = 128;\x0d\x0aInteger i2 = 128;\x0d\x0a此時i1 == i2返回的是false,\x0d\x0a這時因為Integer的數值在-128~127之間時,即在int的範圍內,默認是按照基本類型int來存放的,仍舊存在堆棧中,如果超出了int的範圍,就按照對象的方式來存放和比較了。\x0d\x0a \x0d\x0a2、String類型\x0d\x0aString類型我們有時候也會直接這樣定義:\x0d\x0aString s = “abc”;\x0d\x0a這裡的”abc”稱為字符串常量,也是存在堆棧中的,s中存放的就是指向這個堆棧地址的引用,如果再定義一個\x0d\x0aString s1 = “abc”;\x0d\x0a這時,s與s1存放的是同一個地址的引用,即s與s1指向的是同一個字符串常量,\x0d\x0as == s1的值是true,\x0d\x0a但是如果有\x0d\x0aString s2 = new String(“abc”);\x0d\x0a這時s == s2則為false,因為使用new之後,每次生成的對象都不是同一個,即使存儲的內容相同。\x0d\x0a上面的s == s1,s == s2其實比較的都是地址,並不是裏面的內容。如果要比較內容,可以使用equals()方法。\x0d\x0a\x0d\x0a其他的就不多說了,打起來太慢了,可以自己去看一下java編程思想。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/275847.html