• 值传递和引用传递


    3. 指出下列程序运行的结果 ()
    public class Example {
        String str = new String("good");
        char[] ch = { 'a', 'b', 'c' };
        public static void main(String args[]) {
            Example ex = new Example();
            ex.change(ex.str, ex.ch);
            System.out.print(ex.str + " and ");
            System.out.print(ex.ch);
        }
        public void change(String str, char ch[]) {
            str = "test ok";
            ch[0] = 'g';
        }
    }
    A、 good and abc
    B、 good and gbc
    C、 test ok and abc
    D、 test ok and gbc 
    答案:B
    今天面试官问我为什么是B,我说基本类型是值传递,引用类型是引用地址传递。
    要求我详细说明一下为什么是“good”。我的天,脑子想了半天愣没想出来。
    做了个图:

     

    网上详细说明:
    有的说“因为在java里没有引用传递,只有值传递”,这句话解释一下:
    对于基本类型,传递的是基本类型的值,而对于引用类型传递的是地址。
    所以无论是什么,传递的都是值,因为你可以把地址理解成9x0000这种,也是一个值。
    所以传递的都是值。
    那么方法中什么时候会改变原来的值,什么时候不会呢?
    1、只要是基本类型,传递的是值,这个值是复制了一份出来的,所以怎么都不会改变。
    2、引用类型,传递的是地址,如果这个地址变了,那么原来的值肯定不变。
    3、引用类型,传递的是地址,如果地址没变,而改变了地址对应的对象的属性,那么久会改变原来的值。
    如果还听不明白,那么简单的说,只要在方法里面把传进来的对象重新赋值一个new的对象,那么原来是不变得。
    如同方法中的string,重新赋值了一个字符串,这个时候地址以及改变了,所以原来那个不变。
    而char数组,没有重新复制一个新的char数组,而是把char数组中的元素改变了,那就会改变原来的值。
    参考:http://www.cnblogs.com/linkstar/p/5951141.html
    
    如果还困惑,看下面简单例子:
    public class FooString {
        public static void main(String[] args) {
            String a = "A";
            String b = "B";
            operate(a,b);
            System.out.println(a+ "," + b);
        }
        static void operate(String x, String y) {
            y+=x;
            System.out.println("y=" + y);
            System.out.println("x=" + x);
            y=x;
            System.out.println("y2=" + y);
        }
            //a - A
        //b - B
        //当y = x时,改变了y的引用指向,并没有改变b的,也就是
        //y - 内存A
        //对b的内存没有影响
    }
    输出结果:
    y=BA
    x=A
    y2=A
    A,B
  • 相关阅读:
    你人生中的那口井挖了没有?
    SQL Server 中WITH (NOLOCK)浅析
    如何用SQL语句查询Excel数据?
    ASP.NET Core中的依赖注入(2):依赖注入(DI)
    ASP.NET Core中的依赖注入(1):控制反转(IoC)
    wx小程序的学习
    Mac OS 下安装mysql环境
    Mac 全局变量 ~/.bash_profile 文件不存在的问题
    延期风险原因总结
    homebrew osx下面最优秀的包管理工具
  • 原文地址:https://www.cnblogs.com/ysloong/p/6380273.html
Copyright © 2020-2023  润新知