一 引用传递的三个范例

范例一

package com.mtzsoft;

/**
* 范例一
*
* @author Administrator
*
*/
public class Test1 { public static void main(String[] args) { Demo d1 = new Demo();
d1.setTemp(50); System.out.println("fun1调用之前temp=" + d1.getTemp());
fun1(d1);
System.out.println("fun1调用之后temp=" + d1.getTemp()); } public static void fun1(Demo d2) {
d2.setTemp(100);
}
}
class Demo{ private int temp=0; public int getTemp() {
return temp;
} public void setTemp(int temp) {
this.temp = temp;
} }

控制台打印结果:

调用fun1前值为50,调用后为100,方法所修改的值被保存下来了,那么我们进行内存分析如下:

    * 引用传递(1)内存分析
         *
         *                 fun1(d1)   把d1的引用传递给d2  d2/d1共用内存空间
         *                 --------------                                                                       ---------------
         *                 |        栈         |                                                                     |           堆           |
         *                 ---------------                                                                      ---------------
         *                |       d1          |        -----------------------------------------> |     temp=50    |
         *                 ---------------                             ↑                                          ---------------
         *                |       d2          |    --------------------                                         
         *                 --------------                                                                         
         *                  fun1(d1)执行后,d2断开连接
         *                  --------------                                                                      ---------------
         *                 |        栈          |                                                                   |           堆      |
         *                 ---------------                                                                      ---------------
         *                |       d1          |        -----------------------------------------> |     temp=100|    d2/d1共用内存空间   d2修改temp的值
         *                 ---------------                             ↑                                        ---------------
         *                |       d2          |    ----------x---------                                     
         *                 --------------                               
         */

范例二

package com.mtzsoft;

/**
* 范例二
*
* @author Administrator
*
*/
public class Test2 { public static void main(String[] args) { String str = "hello"; System.out.println("fun2调用之前str=" + str);
fun2(str);
System.out.println("fun2调用之后str=" + str);
} public static void fun2(String s) {
s = "hello word";
}
}

控制台打印结果:

方法fun2调用前和调用后,str的值均为hello,那么String引用传递的内存分析:

/**
         *
         * 引用传递(2)内存分析  (String的不可改变的特性)
         *
         *                 fun2(str)   把str的引用传递给s
         *                 --------------                                                                       ---------------
         *                |        栈            |                                                                  |           堆      |
         *                 ---------------                                                                      ---------------
         *                |       str          |        ----------------------------------------->|     "hello"        |
         *                ---------------                                             ↑                         ----------------
         *                |       s             |        -------------------------
         *                --------------                                                                         
         *                    
         *                 s="hello word"  开辟新内存空间           
         *                 --------------                                                                        -----------------
         *                |        栈          |                                                                     |           堆        |
         *                 ---------------                                                                      ------------------
         *                |       str          |        ----------------------------------------->|       "hello"         |
         *                ---------------                                         ↑x 断开                     ------------------
         *                |       s             |        ------------------------- ---------------> |    "hello word" |
         *                --------------                                                                         -------------------
         *                                        
         *                  fun2(str)执行后
         *                 --------------                                                                       -----------------
         *                 |        栈         |                                                                    |             堆       |
         *                 ---------------                                                                      ------------------
         *                |       str          |        ----------------------------------------->|       "hello"        |
         *                --------------                                                                         ------------------
         *                |       s             |        ------------------------- ---------------> |    "hello word"   |
         *                  --------------                                                                       -------------------
         *
         */

范例三

package com.mtzsoft;

/**
* 范例三
*
* @author Administrator
*
*/
public class Test3 { public static void main(String[] args) { TestString t = new TestString();
t.setTemp("hello"); System.out.println("fun3调用之前temp=" + t.getTemp());
fun3(t);
System.out.println("fun3调用之后temp=" + t.getTemp());
} public static void fun3(TestString ts) { ts.setTemp("hello word");
}
} class TestString { private String temp = ""; public String getTemp() {
return temp;
} public void setTemp(String temp) {
this.temp = temp;
} }

控制台打印结果:

这里被修改的值保留下来了,与范例一相同,引用传递内存分析:

/**
         *
         * 引用传递(3)内存分析
         *
         *                 fun3(t)   把t的引用传递给t1
         *                 --------------                                                                       ----------------------------
         *                 |        栈         |                                                                    |                堆                   |
         *                 ---------------                                                                      -----------------------------
         *                |       t             |        ----------------------------------------->|       temp= "hello"             |
         *                ---------------                                             ↑                          -----------------------------
         *                |      ts             |        -------------------------
         *                 ----------------                                                                     
         *                    
         *                     t1.temp= "hello word";
         *                 --------------                                                                        -------------------------------
         *                |        栈          |                                                                     |                          堆              |
         *                 ---------------                                                                      -------------------------------
         *                |       t             |        ----------------------------------------->  |    temp= "hello word"           |
         *                ----------------                                        ↑x 断开                     -------------------------------
         *                |       ts           |        ----------------------
         *                -----------------                                                                   
         *
         */

通过三道引用传递的分析:范例一与范例二是完全一样的,只是第二个范例体现了String类的内容不可改变的特性。

String的引用传递的更多相关文章

  1. Java中String是“引用”传递

    如题,在java中这是一个典型的问题. 在stackoverflow上已经有很多相似的问题被提问,并且有很多不正确或不完整的答案.如果你不往深处想,这是一个很简单的问题.但如果深入思考,它却很让人迷惑 ...

  2. Java中String的 "引用" 传递

    1.来看一段有趣但又让人困惑的代码片段 public static void main(String[] args){ String x = new String("ab"); c ...

  3. java值传递和引用传递的理解

    java的基础数据类型有:(byte.short.int.long.float.double.char.boolean)八种 基础数据都是值传递,其他都是引用传递.但是引用传递要特别注意:String ...

  4. String作为方法参数传递 与 引用传递

    String作为方法参数传递 String 和 StringBuffer的区别见这里: http://wenku.baidu.com/view/bb670f2abd64783e09122bcd.htm ...

  5. 如何引用传递String Boolean 等,并改变他们的值

    如何引用传递String Boolean 等,并改变他们的值 采用list, 在存入位置改变list的值 如 list.add(true); list.remove(0); list.add(fals ...

  6. String是值传递还是引用传递

    String是值传递还是引用传递 今天上班时,同事发现了一个比较有意思的问题.他把一个String类型的参数传入方法,并在方法内改变了引用的值. 然后他在方法外使用这个值,发现这个String还是之前 ...

  7. (摘录)String是值传递还是引用传递

    String应该是一个封装类型,它应该是引用传递,是可以改变值的, 运行的结果应该是”cd”.我们实际运行一下看看, str=ab,这如何解释呢?难道String是基本类型?也说不通呀. 这就要从ja ...

  8. 对String值不可变的理解以及String类型的引用传递问题

    今天复习java时,突然注意到了一句以前没有注意过的一句话,String 是final修饰的,其值是不可变的.当时看的一脸懵逼,String str = "abc"; str = ...

  9. 请问C#中string是值传递还是引用传递?

    https://www.cnblogs.com/xiangniu/archive/2011/08/17/2143486.html 学了这么久,终于弄明白了... 是引用传递 但是string又有值传递 ...

随机推荐

  1. C++笔记(仅C++特性,需C语言基础)

    C++复习笔记一(类的声明定义应用与构造函数析构函数部分)const在C语言中是"不能被改变值的变量",而在C++种子则是"一种有类型描述的常量",常量必须初始 ...

  2. history.pushState 实现浏览器页面不刷新修改url链接

    最近遇到了在不刷新页面的情况下修改浏览器url链接的需求,遂求助于万能的度娘,最终通过history.pushState()完美解决问题.现在将我理解的一些内容分享一下,不对的地方欢迎大家指出. 在使 ...

  3. 51nod 1242 斐波那契数列的第N项——数学、矩阵快速幂

    普通算法肯定T了,所以怎么算呢?和矩阵有啥关系呢? 打数学符号太费时,就手写了: 所以求Fib(n)就是求矩阵  |  1  1  |n-1  第一行第一列的元素. |  1  0  | 其实学过线代 ...

  4. 【动态规划】bzoj2298: [HAOI2011]problem a

    建模超级妙…… Description 一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话(可能有相同的分数) Input 第一行一个整数n,接 ...

  5. [LUOGU] 1717 钓鱼

    题目描述 话说发源于小朋友精心设计的游戏被电脑组的童鞋们藐杀之后非常不爽,为了表示安慰和鼓励,VIP999决定请他吃一次"年年大丰收",为了表示诚意,他还决定亲自去钓鱼,但是,因为 ...

  6. 如何用纯 CSS 创作一个记事本翻页动画

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/qKOPGw 可交互视频教 ...

  7. (原)剑指offer之位运算

    题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示.   思路: count为1的位数,初始为零 每次右移一为,与1做与运算,结果不为零说明最后一位为1 c++代码如下   in ...

  8. eclipse中新建maven项目无法添加src/main/java问题

    eclipse创建maevn web项目,在选择maven_archetype_web原型后,默认只有src/main/resources这个Source Floder. 按照maven目录结构,添加 ...

  9. invalid LOC header (bad signature)

    [产生原因] 本地maven仓库相关jar存在问题. [解决方案] 删除本地maven相关jar并重新下载.

  10. PAT Basic 1045

    1045 快速排序 著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边. 给定划分后的 N 个互不相同 ...