Java中的值传递和引用传递


今天findbug找到一个代码问题,

Dead store to totalAmount in  heckDetail( Long),意思就是Long类型参数值在方法改变,是不被参数带回去的。有人问Long不是一个引用类型么,为什么修改了值传不回去


private void checkDetail(Long totalAmount){
        totalAmount += Long.parseLong(settleWHTJDetailVO.getAmount());
    }


先看下下面代码,原因是一样的

    /**      * @param args
     */
    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运算产生的对象,需要回收

参考:http://www.cnblogs.com/clara/archive/2011/09/17/2179493.html

参考:http://xiemingmei.iteye.com/blog/1042727


另外,一般会把java数据类型

PrimitiveType(简单类型)

ReferenceType(引用类型)

这2种类型的内存分配

Java的内存分配上,主要分4个块!
一块是用来装代码的,就是编译的东西。
一块是用来装静态变量的,例如用static关键字的变量,例如字符串常量。
一块是stack,也就是栈,是用来装变量和引用类型的!但区别在于,装了变量以后,变量上是有值的,而引用类型本身在stack上是没有值的。
一块是heap,也就是堆!堆可以一句话概括,装new出来的东西!

所以综上所述,基本数据类型都在stack中,而引用类型,变量是放在stack中,真正有内容的东西放在heap中,也就是当new了一个新的引用类型,他就会放在堆中,同时栈中的引用类型变量会指向堆中你new出来的东西!

java拆箱装箱

http://www.cnblogs.com/wangchenyang/archive/2012/02/01/2334760.html

你可能感兴趣的:(java中的值传递和引用传递)