zoukankan      html  css  js  c++  java
  • 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修饰的,不可变,它会在内存中在开辟一块新空间

  • 相关阅读:
    反恐24小时[第1季]——我打赌这是我第一次写观后感
    单片机设计-带时间显示的十字路口交通灯控制系统
    ASPxGridView控件的使用
    DataRow复制一行到另一个DataTable
    参数化、检查点、关联基本理解
    录制方式及一些脚本字段信息
    参数化的一些实践
    [转载]WinXp 自动运行的设置方法
    [转载]Windows Xp中如何设置自动登录
    [转载]WinXp 自动运行的设置方法
  • 原文地址:https://www.cnblogs.com/Zombie-Xian/p/6293923.html
Copyright © 2011-2022 走看看