天天看點

java dead store_Java中的值傳遞和引用傳遞

今天findbug找到一個代碼問題,

Dead store to totalAmount in  heckDetail( Long),意思就是Long類型參數值在方法改變,是不被參數帶回去的。有人問Long不是一個引用類型麼,為什麼修改了值傳不回去。

private void checkDetail(Long totalAmount){

totalAmount += Long.parseLong(settleWHTJDetailVO.getAmount());

}

先看下下面代碼,原因是一樣的

public static void main(String[] args) {

// TODO Auto-generated method stub

Long a = 10l;

System.out.println(a);

change(a);

System.out.println(a);//不變

System.out.println("======");

CC c = new CC(10);

System.out.println(c.i);

change(c);

System.out.println(c.i);//不變

System.out.println("======");

CC d = new CC(10);

System.out.println(d.i);

change2(d);

System.out.println(d.i);//變了

}

private static void change(Long a) {

a += 10;

System.out.println(a);

}

private static void change(CC c) {

c = new CC(200);

System.out.println(c.i);

}

private static void change2(CC c) {

c.i = 300;

System.out.println(c.i);

}

static class CC {

public int i = 0;

public CC(int a) {

i = a;

}

}

原因:Java 程式設計語言隻有值傳遞參數,參數的值是一個副本,引用類型傳的對象位址,基本類型傳的是類型值。

另外,運算時用基本類型long會比封裝類Long快,另外Long運算産生的對象,需要回收

另外,一般會把java資料類型

PrimitiveType(簡單類型)

ReferenceType(引用類型)

這2種類型的記憶體配置設定

Java的記憶體配置設定上,主要分4個塊!

一塊是用來裝代碼的,就是編譯的東西。

一塊是用來裝靜态變量的,例如用static關鍵字的變量,例如字元串常量。

一塊是stack,也就是棧,是用來裝變量和引用類型的!但差別在于,裝了變量以後,變量上是有值的,而引用類型本身在stack上是沒有值的。

一塊是heap,也就是堆!堆可以一句話概括,裝new出來的東西!

是以綜上所述,基本資料類型都在stack中,而引用類型,變量是放在stack中,真正有内容的東西放在heap中,也就是當new了一個新的引用類型,他就會放在堆中,同時棧中的引用類型變量會指向堆中你new出來的東西!

java拆箱裝箱