• Java值传递和引用传递


    1.Java到底是值传递还是引用传递呢?

    对于java中的值传递和引用传递一直颇受争论,《Core Java》的作者,以及JAVA的创造者James Gosling都认为当一个对象或引用类型变量被当作参数传递时,也是值传递,这个值就是对象的引用,因此JAVA中只有值传递,没有引用传递。还有一种说法是引用可以看作是对象的别名,当对象被当作参数传递给方法时,传递的是对象的引用,因此是引用传递。而《Thinking in Java》一书的作者Bruce Eckel则站在了中立的立场上。

    2.值传递和引用传递的区别

    1.值传递:传递的是值的拷贝。也就是说传递后就不互相关了。 
    2.引用传递:传递的是值的引用。是内存空间的地址。也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。 

    示例1:

    package cn.com.example;
    
    /**
     * Created by Jack on 2017/1/17.
     */
    public class Test {
    
        public static void change(int a) {
            a = 50;
        }
    
        public static void main(String[] args) {
            int a = 10;
            System.out.println(a);
            change(a);
            System.out.println(a);
        }
    }

    运行结果:

    10
    10
    

    内存分析:

    示例2:

    package cn.com.example;
    
    /**
     * Created by Jack on 2017/1/17.
     */
    public class Test {
    
        public static void change(int[] a) {
            a[0] = 50;
        }
    
        public static void main(String[] args) {
            int[] a = {10, 20};
            System.out.println(a[0]);
            change(a);
            System.out.println(a[0]);
        }
    }
    

    结果:

    10
    50
    

    内存分析:

    示例3:

    package cn.com.example;
    
    /**
     * Created by Jack on 2017/1/17.
     */
    public class Test {
    
        public static void change(Emp emp) {
            emp.age = 50;
            emp = new Emp();//再创建一个对象
            emp.age = 100;
        }
    
        public static void main(String[] args) {
            Emp emp = new Emp();
            emp.age = 100;
            System.out.println(emp.age);
            change(emp);
            System.out.println(emp.age);
            System.out.println(emp.age);
        }
    }
    
    class Emp {
        public int age;
    }
    

    结果:

    100
    50
    50
    

    内存分析:

    示例4:

    package cn.com.example;
    
    /**
     * Created by Jack on 2017/1/17.
     */
    public class Test {
    
        public static void change(String s) {
            s = "zhangsan";
        }
    
        public static void main(String[] args) {
            String s = new String("lisi");
            System.out.println(s);
            change(s);
            System.out.println(s);
        }
    }
    

    结果:

    lisi
    lisi
    

    由于String类是final修饰的,不可变,它会在内存中在开辟一块新空间

  • 相关阅读:
    HL 7.19 FFT多项式乘法
    HL 7.18 杂题整理 随笔
    BZOj 3208 食物 生成函数+广义二项式定理
    HL 7.14 整理杂题 随笔
    AC自动机 后缀数组 随笔
    Python 之time时间模块
    Python 之sys系统模块
    Uni-app 之猿产地项目
    Tkinter 之socket聊天室
    Python 之logging日志模块
  • 原文地址:https://www.cnblogs.com/Zombie-Xian/p/6293923.html
Copyright © 2020-2023  润新知