⑴ java里什麼是引用類型
Java的引用類型:
引用類型是一個對象類型,值是什麼呢?它的值是指向內存空間的引用,就是地址,所指向的內存中保存著變數所表示的一個值或一組值。
Java 提供兩種不同的類型:引用類型和原始類型(或內置類型)。
引用類型和原始類型的行為完全不同,並且它們具有不同的語義。
引用類型和原始類型具有不同的特徵和用法,它們包括:大小和速度問題,這種類型以哪種類型的數據結構存儲,當引用類型和原始類型用作某個類的實例數據時所指定的預設值。
對象引用實例變數的預設值為 null,而原始類型實例變數的預設值與它們的類型有關。同時為了面向對象操作的一致性。
這些基本類型都有相應的封裝類型:Integer、Short、Long、Byte、Float、Double、Character等。
⑵ Java 引用類型參數(見題注釋)
要是這樣的話,下面的一個system就會輸出7654321,你上面system還是你new的這個date;你下面的方法並沒有任何返回值;
⑶ 誰知道Java中參數是引用傳遞還是值傳遞
java中方法參數傳遞方式是按值傳遞。所謂值傳遞,就是將實際參數值的副本(復製品)傳入方法內,而自己本身不會受到任何影響。
如果參數是基本類型,傳遞的是基本類型的字面量值的拷貝。
⑷ JAVA的基本數據類型和引用數據類型的區別
一、作用的不同
1、引用類型一般都是通過new關鍵字創建對象,然後把這個對象賦予給相應的變數,最常用的引用類型是String類型,它也比較特殊,可以直接通過關鍵字new來創建對象,也可以通過字元串直接賦值,比如:
Strings=newString("abc");
Strings="abc";
2、基本類型就是直接賦值就可以了,比如:
inta=123;
floatb=123.0;
boolean=true;
二、參數方面傳遞的不同
引用類型是引用傳遞
基本類型是值傳遞
三、比較方面的不同
引用類型比較的是引用地址(沒有重寫equals方法)
基本類型比較的是值
五、類型的不同
1、引用類型分為四種
強引用(StrongReference)
軟引用(SoftRefernce)
弱引用(WeakReference)
虛引用(PhantomReference)
強引用-StrongReference
2、八種基本類型
整型byte8位
整型short16位
整型int32位
整型long64位
浮點型float32位
浮點型double64位
字元型char16位
布爾型boolean位數不確定
⑸ java引用類型參數
1.
為什麼int
temp
=
p.age;不會提示尚未初始化
這句話不會報錯,因為p是做為參數類型傳入的,編譯器並不知道你到底有沒有初始化p,他會當作以創建對象處理。
2.
而main方法卻提示未初始化
在main方法中你定義了一個person
per;但沒有進行初始化,就直接使用per里的屬性是不可以的,因為變數沒有進行初始化是不能夠使用的。
⑹ java中傳的是引用類型的參數怎麼傳
個人理解是這樣的
java 傳參有兩種類型。傳值和傳址。8種原始類型(int,long,double,boolean,float,short,byte,char)採用傳值方式,類的實體採用傳址方式。
如果想採用傳址方式,但不想改變裡面的內容,就調用clone方法後傳過去吧。
如有不對,以教科書為准。
⑺ Java引用類型作為方法參數的問題
java當中類變數都是引用。
方法參數當中的類引用,需要你在調用的時候給出真正的對象,所以不會警告你;
但是局部變數當中的變數,如果不用new創建,自然是沒有初始化。
⑻ java引用類型參數的傳值
基本類型參數都是值傳遞,引用類型想數組,集合都是引用傳遞,值傳遞後你改變參數的值,原來的數不會改變,就相當於重新開辟一塊空間,改變的是新空間的值,引用傳遞,是吧引用傳過去了,沒有開辟空間,你改變值還是改變原來空間的值,我這回答滿意不,純手寫加工~~~~~~~~
⑼ java三個引用類型
四種引用類型
所以在 JDK.1.2 之後,Java 對引用的概念進行了擴充,將引用分為了:強引用(Strong Reference)、軟引用(Soft Reference)、弱引用(Weak Reference)、虛引用(Phantom Reference)4 種,這 4 種引用的強度依次減弱。
一,強引用
Java中默認聲明的就是強引用,比如:
Object obj = new Object(); //只要obj還指向Object對象,Object對象就不會被回收
obj = null; //手動置null
只要強引用存在,垃圾回收器將永遠不會回收被引用的對象,哪怕內存不足時,JVM也會直接拋出OutOfMemoryError,不會去回收。如果想中斷強引用與對象之間的聯系,可以顯示的將強引用賦值為null,這樣一來,JVM就可以適時的回收對象了
二,軟引用
軟引用是用來描述一些非必需但仍有用的對象。在內存足夠的時候,軟引用對象不會被回收,只有在內存不足時,系統則會回收軟引用對象,如果回收了軟引用對象之後仍然沒有足夠的內存,才會拋出內存溢出異常。這種特性常常被用來實現緩存技術,比如網頁緩存,圖片緩存等。
在 JDK1.2 之後,用java.lang.ref.SoftReference類來表示軟引用。
下面以一個例子來進一步說明強引用和軟引用的區別:
在運行下面的Java代碼之前,需要先配置參數 -Xms2M -Xmx3M,將 JVM 的初始內存設為2M,最大可用內存為 3M。
首先先來測試一下強引用,在限制了 JVM 內存的前提下,下面的代碼運行正常
public class TestOOM {
public static void main(String[] args) {
testStrongReference();
}
private static void testStrongReference() {
// 當 new byte為 1M 時,程序運行正常
byte[] buff = new byte[1024 * 1024 * 1];
}
}
但是如果我們將
byte[] buff = new byte[1024 * 1024 * 1];
替換為創建一個大小為 2M 的位元組數組
byte[] buff = new byte[1024 * 1024 * 2];
則內存不夠使用,程序直接報錯,強引用並不會被回收
接著來看一下軟引用會有什麼不一樣,在下面的示例中連續創建了 10 個大小為 1M 的位元組數組,並賦值給了軟引用,然後循環遍歷將這些對象列印出來。
public class TestOOM {
private static List<Object> list = new ArrayList<>();
public static void main(String[] args) {
testSoftReference();
}
private static void testSoftReference() {
for (int i = 0; i < 10; i++) {
byte[] buff = new byte[1024 * 1024];
SoftReference<byte[]> sr = new SoftReference<>(buff);
list.add(sr);
}
System.gc(); //主動通知垃圾回收
for(int i=0; i < list.size(); i++){
Object obj = ((SoftReference) list.get(i)).get();
System.out.println(obj);
}
}
}
列印結果:
我們發現無論循環創建多少個軟引用對象,列印結果總是只有最後一個對象被保留,其他的obj全都被置空回收了。
這里就說明了在內存不足的情況下,軟引用將會被自動回收。
值得注意的一點 , 即使有 byte[] buff 引用指向對象, 且 buff 是一個strong reference, 但是 SoftReference sr 指向的對象仍然被回收了,這是因為Java的編譯器發現了在之後的代碼中, buff 已經沒有被使用了, 所以自動進行了優化。
如果我們將上面示例稍微修改一下:
private static void testSoftReference() {
byte[] buff = null;
for (int i = 0; i < 10; i++) {
buff = new byte[1024 * 1024];
SoftReference<byte[]> sr = new SoftReference<>(buff);
list.add(sr);
}
System.gc(); //主動通知垃圾回收
for(int i=0; i < list.size(); i++){
Object obj = ((SoftReference) list.get(i)).get();
System.out.println(obj);
}
System.out.println("buff: " + buff.toString());
}
則 buff 會因為強引用的存在,而無法被垃圾回收,從而拋出OOM的錯誤。
如果一個對象惟一剩下的引用是軟引用,那麼該對象是軟可及的(softly reachable)。垃圾收集器並不像其收集弱可及的對象一樣盡量地收集軟可及的對象,相反,它只在真正 「需要」 內存時才收集軟可及的對象。
三,弱引用
弱引用的引用強度比軟引用要更弱一些,無論內存是否足夠,只要 JVM 開始進行垃圾回收,那些被弱引用關聯的對象都會被回收。在 JDK1.2 之後,用 java.lang.ref.WeakReference 來表示弱引用。
我們以與軟引用同樣的方式來測試一下弱引用:
private static void testWeakReference() {
for (int i = 0; i < 10; i++) {
byte[] buff = new byte[1024 * 1024];
WeakReference<byte[]> sr = new WeakReference<>(buff);
list.add(sr);
}
System.gc(); //主動通知垃圾回收
for(int i=0; i < list.size(); i++){
Object obj = ((WeakReference) list.get(i)).get();
System.out.println(obj);
}
}
列印結果:
可以發現所有被弱引用關聯的對象都被垃圾回收了。
四,虛引用
虛引用是最弱的一種引用關系,如果一個對象僅持有虛引用,那麼它就和沒有任何引用一樣,它隨時可能會被回收,在 JDK1.2 之後,用 PhantomReference 類來表示,通過查看這個類的源碼,發現它只有一個構造函數和一個 get() 方法,而且它的 get() 方法僅僅是返回一個null,也就是說將永遠無法通過虛引用來獲取對象,虛引用必須要和 ReferenceQueue 引用隊列一起使用。
public class PhantomReference<T> extends Reference<T> {
/**
* Returns this reference object's referent. Because the referent of a
* phantom reference is always inaccessible, this method always returns
* <code>null</code>.
*
* @return <code>null</code>
*/
public T get() {
return null;
}
public PhantomReference(T referent, ReferenceQueue<? super T> q) {
super(referent, q);
}
}
那麼傳入它的構造方法中的 ReferenceQueue 又是如何使用的呢?
五,引用隊列(ReferenceQueue)
引用隊列可以與軟引用、弱引用以及虛引用一起配合使用,當垃圾回收器准備回收一個對象時,如果發現它還有引用,那麼就會在回收對象之前,把這個引用加入到與之關聯的引用隊列中去。程序可以通過判斷引用隊列中是否已經加入了引用,來判斷被引用的對象是否將要被垃圾回收,這樣就可以在對象被回收之前採取一些必要的措施。
⑽ java中的引用數據類型是什麼意思
引用數據類型為java兩大數據類型之一
引用數據型在被床架時,首先要在棧上給其引用(句柄)分配一塊內存,而對象的具體信息都存儲在堆內存上,然後由棧上面的引用指向堆中對象的地址。
引用數據類型包括:類、介面類型、數組類型、枚舉類型、註解類型,字元串型;
java另一大數據類型為基本數據類型,其包括包括數值型,字元型和布爾型。
基本數據類型在被創建時,在棧上給其劃分一塊內存,將數值直接存儲在棧上;