java值传递和引用传递的理解
java的基础数据类型有:(byte、short、int、long、float、double、char、boolean)八种
基础数据都是值传递,其他都是引用传递。但是引用传递要特别注意:String Integer Double等这几个类型,以下以String为例。
举例说明:
public static void main(String[] args) {
String a="zkj";
System.out.println("str :");
strTest(a);
System.out.println("str :");
}
public static void strTest(String b){ //这里b的地址指向main方法中a的地址
b="hello,"+b; //这里虽然也是引用传递,但是这里等于是新建了对象,并把地址指向这里的b
System.out.println(b);
}
打印:
str : zkj
str : zkj
这里String是引用传递,但是调用strTest方法后,执行:
b="hello,"+b; 看似改变了传入的参数,但是其实是由于新建了一个string对象,所以内存中存在a:zkj,b:hello zkj,两个地址,所以这时候a的值还是 不变的。 其他的情况:
public class Main { public static void main(String[] args) { String a="zkj";
System.out.println("str :");
strTest(a);
System.out.println("str :"); StringBuffer sb=new StringBuffer("zkj,");
objTest(sb);
System.out.println("obj :"+sb.toString()); final StringBuffer s=new StringBuffer("aa");
System.out.println(s);
s.append("bb");
System.out.println(s); } public static void strTest(String b){ //这里b的地址指向main方法中a的地址
b="hello,"+b; //这里虽然也是引用传递,但是这里等于是新建了对象,并把地址指向这里的b
System.out.println(b);
} public static void objTest(StringBuffer a){
a.append("hahah");
System.out.println(a.toString());
} }
这里打印:
zkj,hahah
新增了一个StringBuffer对象sb,学习过jvm的就了解,这里会在栈中生成一个sb,堆中生成一个“zkj,”对象,sb引用这个堆中的地址。调用ojbTest方法后,sb新增了字符串hahah,堆中的sb对象增加了这个string.
那什么时候可以像上例中String赋值一样,sb的值保持不变呢?
很简单,类似上例,我们也新建一个对象。 在ojbTest中。
public static void objTest(StringBuffer a){
a=new StringBuffer();
a.append("hahah");
System.out.println(a.toString());
}
这样main中就会打印: zkj,
解释如同上例。
java值传递和引用传递的理解的更多相关文章
- 理解java值传递与引用传递
1.基本类型和引用类型在内存中的保存 Java中数据类型分为两大类,基本类型和对象类型.相应的,变量也有两种类型:基本类型和引用类型.基本类型的变量保存原始值,即它代表的值就是数值本身:而引用类型的变 ...
- 堆栈详解 + 彻底理解Java的值传递和引用传递
本文旨在用最通俗的语言讲述最枯燥的基本知识 学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨 ...
- JAVA不可变类与可变类、值传递与引用传递深入理解
一个由try...catch...finally引出的思考,在前面已经初步了解过不可变与可变.值传递与引用传递,在这里再次深入理解. 1.先看下面一个try..catch..finally的例子: P ...
- 理解java中的值传递与“引用传递”
额....java中其实没有引用传递 对于引用类型 ,在调用方法后,直接拷贝了引用的副本,但是它们指向了相同的堆地址,所以看起来像引用传递,但其实是值传递,只不过传递的引用的副本. 说一说为什么Str ...
- Java中引用类型变量,对象,值类型,值传递,引用传递 区别与定义
一.Java中什么叫做引用类型变量?引用:就是按内存地址查询 比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里new了一个Stri ...
- java中值传递和引用传递
最近工作中使用到了值传递和引用传递,但是有点懵,现在看了下面的文章后清晰多了.一下是文章(网摘) 1:按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递.示例如下: public clas ...
- Java中的值传递和引用传递
这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...
- java的值传递和引用传递
昨天博主在对于值传递和引用传递这里栽了一个大坑啊,导致一下午时间都浪费在这里,我们先说下值传递和引用传递java官方解释: 值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对 ...
- java中方法的参数传递机制(值传递还是引用传递)
看到一个java面试题: 问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java 编程语言只有值传递参 ...
- java 对象传递 是 值传递 还是 引用传递?
这个问题说实话我感觉没有太大的意义. 按第一印象和c++的一些思想去理解的话对象传递是引用传递,因为传递过去的对象的值能被改变. 但是又有很多人,不知道从哪里扣出来一句,java中只有值传递,没有引用 ...
随机推荐
- 1568: [JSOI2008]Blue Mary开公司(超哥线段树)
1568: [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1198 Solved: 418 Descr ...
- JSP自定义tld方法标签
卧槽 我们可以通过tld文件,自定义一个方法标签,以便在页面中使用,目录通常放在WEB-INF下面的tlds文件夹: 引入方式示例,直接在jsp上引入tld标签文件: <%@ taglib pr ...
- DWR搭建以及使用教程
DWR搭建以及使用教程 DWR(Direct Web Remoting)是一个Ajax的开源框架,用于改善web页面与Java类交互的远程服务器端的交互体验,可以帮助开发人员开发包含AJAX技术的 ...
- idea下的hibernate反向生成插件
阅读目录 1. 打开 DataBase 窗口,添加数据源 2. 添加 hibernate 持久层支持,生成实体 Bean /配置文件 谈起 Hibernate 应该得知道 Gavin King 大叔, ...
- 【bzoj4059】[Cerc2012]Non-boring sequences 分治
题目描述 我们害怕把这道题题面搞得太无聊了,所以我们决定让这题超短.一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子序列里至少存在一个数字只出现一次.给定一个整数序列, ...
- php函数注释
https://segmentfault.com/q/1010000003087072 phpstorm /**+回车
- get****Context各个方法分析
1 getApplicationContext分析 该方法为contextImpl类的方法,返回一个ApplicationContext.方法代码为: public Context getApplic ...
- Memcache缓存用好了,性能有了很大的提高
web服务器1 web服务器2 web服务器3如果每台web服务器都向mysql服务器表插入信息并且要做出相应最新编号反馈出现这样的高并发时候怎么减少服务器压力,同时用户体验还要好 可以使用Memca ...
- HDOJ 1398 Square Coins
Square Coins Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- LOJ#2132. 「NOI2015」荷马史诗
$n \leq 100000$个数字,放进$k$叉树里,一个点只能放一个数,使所有数字乘以各自深度这个值之和最小的同时,最大深度的数字最小. 哈夫曼.这是我刚学OI那段时间看到的,感觉就是个很无聊的贪 ...