java中参数传递的问题
public class Test {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operate(a,b);
System.out.println(a + "," +b);
}
static void operate(StringBuffer x, StringBuffer y) {
x.append(y);
y =x;
}
}
为什么上面的a的值会发生改变呢?
而b的值又不变呢?
不是说java中方法传参数都是传值吗?
解答:
传参的时候,不管传什么,都是一个copy的过程. 简单点说.就是把实参的值拷贝给形参, 方法里面操纵的只是你的形参, 而对实参一点影响都没有..!
基本数据类型是copy值,对象类型是copy的地址.记住这一点,你上面的问题就很好解决了.
拿你的程序说话吧,关于引用问题5楼已经说的很好了
|
1
2
3
4
5
6
7
8
9
10
11
12
|
public Test { publicstaticvoid main(String[] args) {StringBuffer a =newStringBuffer("A");StringBuffer b =newStringBuffer("B");operate(a,b);System.out.println(a +","+b); } static operate(StringBuffer x, StringBuffer y) {
x.append(y);y =x;//这里,只是说明变量y的引用变了,而跟b没有任何关系}} |
这里, a是指向"A"的.b是指向"B"的.这点应该没有问题.
然而你调用方法的时候把a,b作为参数传进去,那么.这个时候,只是把a的地址copy拷贝给了x,b的地址copy拷贝给了y,
方面里面,x指向的对象发生了变化,变成了"AB",然而a跟x是指向同一个对象的. 下面输出a会是"AB"
“Java中对象一定是引用传递的,所以当不需要传递引用时,可以用clone(),拷贝一个副本进去,” “ 语言是规则,算法是思想”
关于b,看上面的注释,调试下就知道了,当执行到那句代码时.. 现在是x,y,a都指向"AB"这个对象.而b还是始终指向"B"的,始终没有改变..所以才有你下面那个结果..
java中参数传递的问题的更多相关文章
- Java中参数传递问题
Java中参数传递可以分为值传递和引用传递,话不多说直接撸代码 1.传原始类型(int,String等)数据是值传递 package test_1; public class Test { publi ...
- 如何理解Java中参数传递只能传值?
以前学习C#的时候,是完全在工作岗位上学习,一些底层较为深入的道理都不是很清楚.如今学习了Java,对于Java参数传递只能传值,不能传引用(指针)感到很困惑,在C#中不是常常说把某个引用传递到函数中 ...
- Java中参数传递时值传递的机制分析
参数传递是什么? 在C的函数或是JAVA的方法中,向一个函数或方法内部传递一个参数,比如: void fun( int num ){ num+=2 ; } int a = 3 ...
- java中参数传递--值传递,引用传递
java中的参数传递——值传递.引用传递 参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递. 在 Java 应用程序中永远不会传递对象,而只传递对象引用. ...
- 12.java中参数传递机制---形参和实参
1.形参:用来接收调用该方法时传递的参数.只有在被调用的时候才分配内存空间,一旦调用结束,就释放内存空间.因此仅仅在方法内有效. public void swap(int a, int b) { in ...
- java中参数传递实例
//在函数中传递基本数据类型, 2. public class Test { 4. public static void change(int i, in ...
- java中参数传递
一.参数是基本类型 相当于C++传值调用,方法中的形参是实参的副本. 二.参数是类类型 类类型的参数在方法调用中,相当于C++中的传址调用.形参是实参引用同一个对象.所有形参修改则实参也修改了 三.总 ...
- java中的参数传递是按引用传递还是按值传递
最近去面试,有一个面试官问到java中参数传递的问题,感觉自己对于这一块还是理解的不够深.今天我们就一起来学习一下Java中的接口和抽象类.下面是本文的目录大纲: 一 . 什么是按值传递,什么是按引用 ...
- Java中内存中的Heap、Stack与程序运行的关系
堆和栈的内存管理 栈的内存管理是顺序分配的,而且定长,不存在内存回收问题:而堆 则是随机分配内存,不定长度,存在内存分配和回收的问题:堆内存和栈内存的区别可以用如下的比喻来看出:使用堆内存就象是自己动 ...
随机推荐
- jQuery校验 表单验证
官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation jQuery plugin: Validation 使用说明 转载 ...
- ORCAD常见DRC错误
一下就是网上整理的: https://blog.csdn.net/weixin_39671078/article/details/85344762 https://wenku.baidu.com/vi ...
- http协议---简述
http(Hypertext transfer protocol)超文本传输协议,通过浏览器和服务器进行数据交互,进行超文本(文本.图片.视频等)传输的规定. 也就是说,http协议规定了超文本传输所 ...
- 一些移动端的ui框架
一些移动端的ui框架 https://jqweui.cn/resource
- 521. Longest Uncommon Subsequence I【easy】
521. Longest Uncommon Subsequence I[easy] Given a group of two strings, you need to find the longest ...
- grails email 发送邮件插件
1.配置email插件,在Config.groovy文件中配置: plugins { compile ":mail:1.0.5" } 2.配置Config.groovy文件: gr ...
- 巧用批处理cmd快速切换IP地址
如果你的笔记本经常在不同的地方使用,有些地方需要自动获取IP,而有些地方需要配置固定IP,每换一个地方都需要重新配置一遍,是不是感觉很麻烦呢? 下面介绍一种通过建立批处理文件来快速切换IP的方法: s ...
- 使用nginx cache缓存网站数据实践
Nginx本身就有缓存功能,能够缓存静态对象,比如图片.CSS.JS等内容直接缓存到本地,下次访问相同对象时,直接从缓存即可,无需访问后端静态服务器以及存储存储服务器,可以替代squid功能. 1 ...
- OpenCV学习笔记十:opencv_superres模块
一,简介: 该库用于图像超分辨率重建.即通过硬件或软件的方法提高原有图像的分辨率,通过一系列低分辨率的图像来得到一幅高分辨率的图像.
- mongo 过滤查询条件后分组、排序
描述:最近业主有这么一个需求,根据集合中 时间段进行过滤,过滤的时间时间段为日期类型字符串,需要根据某一日期进行截取后.进行分组,排序 概述题目:根据createTime时间段做查询,然后以 天进行分 ...