zoukankan      html  css  js  c++  java
  • 值传递和引用传递

    值传递:传递真实值。

    引用传递:传递内存地址。

    1、基本类型

    上面的demo输出的是10,而不是20。为什么?

    ①.程序运行时,main方法先入栈,然后给变量a分配内存。

    ②.当运行到changeVal(a);时,changeVal()方法入栈。当方法入栈时,会给局部变量和形参变量(a)分配内存.

       即在changeVal方法栈里面,也有一个名为a,值为10的变量。

    ③.由于a+=10;是在changeVal方法栈里面运行的,所以只会改变changeVal方法栈里面的a值,而不会改变main方法栈里面的a值。如下图

    输出是hello world,可见builder的值是改变了.
    与基本类型不一样,主要是StringBuilder是引用类型。因此new StringBuilder("hello")的内存是分配在堆区。而在栈区的变量(builder)只保存一个地址(假设为0x345),如下图:

    因此,main和changeVal两个方法栈的builder变量都指向了同一块内存。故当changVal方法中改变builder的值,main中的builder也会变化。

    上面的demo输出的是:hello,而不是hello world。str记录了对象的地址,那么str的值应该也被改变了才对?

    这跟String的"特性"有关,String会被存放在字符串常量池,而且String是不可被改变的(final).

    ①.在第10行设个断点,当执行到这行的时候,由上面的分析可知,main()和changeVal()方法中的str都指向了常量池中的"hello"字符串。

    ②.执行str+=" world"时,由于String是不可变的,所以不可能直接在"hello"上做修改。这时会在常量池中新增一个"hello world"的字符串,并将地址传给changeVal()方法栈中的str.

    ③.因此changeVal()方法中的str指向了新增的"hello world"字符串,而main方法中的str还是指向原来的"hello"。所以输出"hello".

    如下图,有变量builder,值指向了堆内存地址(假设为0x456)。但是builder变量本身也有地址(假设为0x123)。传递的时候,传的就是0x123.

  • 相关阅读:
    SQL语句实例学习汇总
    sql语句一些实用技巧for oracle
    无限级递归生成HTML示例及ListBox,DropDownList等无限树
    另类Sql语句直接导出表数据到Execl
    powerdesigner中sql脚本小写转大写,去双引号
    C#中利用jQuery获取Json值示例,Ajax方式。
    利用jquery解决下拉菜单被Div遮挡问题
    获取Textarea 元素当前的光标位置及document.selection.createRange()资料
    oracle中一些常用函数
    IE6 动态创建 iframe 无法显示的 bug,万恶的IE6
  • 原文地址:https://www.cnblogs.com/wenbiquan/p/11081173.html
Copyright © 2011-2022 走看看