String的引用传递
一 引用传递的三个范例
范例一
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的引用传递的更多相关文章
- Java中String是“引用”传递
如题,在java中这是一个典型的问题. 在stackoverflow上已经有很多相似的问题被提问,并且有很多不正确或不完整的答案.如果你不往深处想,这是一个很简单的问题.但如果深入思考,它却很让人迷惑 ...
- Java中String的 "引用" 传递
1.来看一段有趣但又让人困惑的代码片段 public static void main(String[] args){ String x = new String("ab"); c ...
- java值传递和引用传递的理解
java的基础数据类型有:(byte.short.int.long.float.double.char.boolean)八种 基础数据都是值传递,其他都是引用传递.但是引用传递要特别注意:String ...
- String作为方法参数传递 与 引用传递
String作为方法参数传递 String 和 StringBuffer的区别见这里: http://wenku.baidu.com/view/bb670f2abd64783e09122bcd.htm ...
- 如何引用传递String Boolean 等,并改变他们的值
如何引用传递String Boolean 等,并改变他们的值 采用list, 在存入位置改变list的值 如 list.add(true); list.remove(0); list.add(fals ...
- String是值传递还是引用传递
String是值传递还是引用传递 今天上班时,同事发现了一个比较有意思的问题.他把一个String类型的参数传入方法,并在方法内改变了引用的值. 然后他在方法外使用这个值,发现这个String还是之前 ...
- (摘录)String是值传递还是引用传递
String应该是一个封装类型,它应该是引用传递,是可以改变值的, 运行的结果应该是”cd”.我们实际运行一下看看, str=ab,这如何解释呢?难道String是基本类型?也说不通呀. 这就要从ja ...
- 对String值不可变的理解以及String类型的引用传递问题
今天复习java时,突然注意到了一句以前没有注意过的一句话,String 是final修饰的,其值是不可变的.当时看的一脸懵逼,String str = "abc"; str = ...
- 请问C#中string是值传递还是引用传递?
https://www.cnblogs.com/xiangniu/archive/2011/08/17/2143486.html 学了这么久,终于弄明白了... 是引用传递 但是string又有值传递 ...
随机推荐
- shell脚本,awk常见初始化变量的题目。
文件 内容如下 clone=line1gb=line1gi=line1lib=line1gb=line2gi=line2lib=line2clone=line3gb=line3gi=line3lib= ...
- java在线聊天项目0.5版 解决客户端向服务器端发送信息时只能发送一次问题 OutputStreamWriter DataOutputStream socket.getOutputStream()
没有解决问题之前客户端代码: package com.swift; import java.awt.BorderLayout; import java.awt.Color; import java.a ...
- sass --watch 失败bug
NameError: uninitialized constant Sass::Plugin::Compiler::SassListen 网上说法是sass v3.2.10有bug 但是我版本3.5. ...
- js事件(事件冒泡与事件捕获)
事件冒泡和事件捕获分别由微软和网景公司提出,这两个概念都是为了解决页面中事件流(事件发生顺序)的问题. <div id='aa' click='po'> <p id='bb' cli ...
- substring substr slice 区别
1. substring(start,end) 返回指定索引区间的字串,不改变原字符串 start 必需,开始位置的索引,一个非负的整数 end 可选,结束位置的索引(不包括其本身),如果未设置, ...
- (9)zabbix创建监控项item
1. 创建监控项 点击配置(configuration)->主机(Hosts)->在你要配置的主机一栏上点击Items->点击create item.具体看截图,各个参数我都已经标注 ...
- (4)zabbix监控第一台服务器
2. zabbix监控服务器 创建主机,选择模板以及录入基本信息,过一分钟左右,就可以看到cpu.内存.硬盘等等使用情况.本节以图文为主.by the way, zabbix中文翻译很烂,config ...
- pytorch导入错误so: undefined symbol: _Z11libshm_initPKc
首先删除torch文件 或者直接卸载 删除会更彻底 https://blog.csdn.net/qq_37674858/article/details/88870124 但是会发现卸载重装pytorc ...
- “程序设计与算法训练”课程设计:“BP神经网络的实现”(C++类封装实现)
一 题目: 71 BP神经网络的实现: 利用C++语言实现BP神经网络, 并利用BP神经网络解决螨虫分类问题: 蠓虫分类问题:对两种蠓虫(A与B)进行鉴别,依据的资料是触角和翅膀的长度,已知了9支Af ...
- BZOJ 1587: 叶子合并leaves
题目大意:求n个数分成k段的最小代价. 题解:DP,没什么好说的. 代码: #include<cstdio> #include<algorithm> using namespa ...