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楼已经说的很好了

Java code

?

1
2
3
4
5
6
7
8
9
10
11
12
public
class
Test {
publicstatic
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;//这里,只是说明变量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中参数传递的问题的更多相关文章

  1. Java中参数传递问题

    Java中参数传递可以分为值传递和引用传递,话不多说直接撸代码 1.传原始类型(int,String等)数据是值传递 package test_1; public class Test { publi ...

  2. 如何理解Java中参数传递只能传值?

    以前学习C#的时候,是完全在工作岗位上学习,一些底层较为深入的道理都不是很清楚.如今学习了Java,对于Java参数传递只能传值,不能传引用(指针)感到很困惑,在C#中不是常常说把某个引用传递到函数中 ...

  3. Java中参数传递时值传递的机制分析

    参数传递是什么?      在C的函数或是JAVA的方法中,向一个函数或方法内部传递一个参数,比如:   void fun( int num ){     num+=2 ; }   int a = 3 ...

  4. java中参数传递--值传递,引用传递

    java中的参数传递——值传递.引用传递   参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递. 在 Java 应用程序中永远不会传递对象,而只传递对象引用. ...

  5. 12.java中参数传递机制---形参和实参

    1.形参:用来接收调用该方法时传递的参数.只有在被调用的时候才分配内存空间,一旦调用结束,就释放内存空间.因此仅仅在方法内有效. public void swap(int a, int b) { in ...

  6. java中参数传递实例

    //在函数中传递基本数据类型,            2. public class Test {         4.     public static void change(int i, in ...

  7. java中参数传递

    一.参数是基本类型 相当于C++传值调用,方法中的形参是实参的副本. 二.参数是类类型 类类型的参数在方法调用中,相当于C++中的传址调用.形参是实参引用同一个对象.所有形参修改则实参也修改了 三.总 ...

  8. java中的参数传递是按引用传递还是按值传递

    最近去面试,有一个面试官问到java中参数传递的问题,感觉自己对于这一块还是理解的不够深.今天我们就一起来学习一下Java中的接口和抽象类.下面是本文的目录大纲: 一 . 什么是按值传递,什么是按引用 ...

  9. Java中内存中的Heap、Stack与程序运行的关系

    堆和栈的内存管理 栈的内存管理是顺序分配的,而且定长,不存在内存回收问题:而堆 则是随机分配内存,不定长度,存在内存分配和回收的问题:堆内存和栈内存的区别可以用如下的比喻来看出:使用堆内存就象是自己动 ...

随机推荐

  1. 自己动手制作更好用的markdown编辑器-03

    这里文章都是从个人的github博客直接复制过来的,排版可能有点乱. 原始地址 http://benq.im/2015/04/24/hexomd-03/ 文章目录 1. 系统模块 2. 记录上次打开的 ...

  2. Java 8里 Stream和parallelStream的区别

    Java中Stream和parallelStream,前者是单管,后者是多管,运行时间上做一个小对比,直接上代码: /** * * @author zhangy6 * <p>对比Strea ...

  3. VS2017 - Winform 简单托盘小程序

    界面比较简单,主要两个button 一个NotifyIcon 和 右键菜单 控件, NotifyIcon 属性,如下: 并为NotifyIcon指定了DoubleClick事件: 主窗体增加两个事件: ...

  4. netty的理解

    netty作为nio应用的典范,在很多设计方面都值得我们在程序开发中学习. 1.事件驱动,三种事件的传播机制.一种是在channel上触发,一种是在pipeline上触发,一种是在context上触发 ...

  5. c#序列化和反序列化list

    List<UserData> lstStuModel = new List<UserData>() { new UserData(){Name="001", ...

  6. Java Resource路径小结

    首先一点很重要,Java中不存在标准的相对路径,各种相对路径取资源的方式都是基于某种规则转化为绝对路劲 然后一点也很重要,绝对不要直接使用绝对路径,否则死得很难看 基于以上两点,总结Resource路 ...

  7. Qt5 CMake cross compile

    cmake_minimum_required(VERSION 2.8) if (${ARM}) set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCES ...

  8. [浪风转载]Jquery取得iframe中元素的几种方法

    iframe在复合文档中经常用到,利用jquery操作iframe可以大幅提高效率,这里收集一些基本操作 DOM方法:父窗口操作IFRAME:window.frames["iframeSon ...

  9. Struts2是一个基于MVC设计模式的Web应用框架

    Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互. Struts ...

  10. java算法学习

    最大公约数 欧几里得算法 描述:计算两个非负整数p和q的最大公约数: 若q是0,则最大公约数为p. 否则,将p除以q得到余数r,p和q的最大公约数即为q和r的最大公约数. 根据算法的自然描述,我们可以 ...