java的參数传递方式到底是值传递还是引用传递,这一直是一个争论不休的问题,一直以来没有形成统一意见。

在这里,我也仅仅是说一说个人见解,不保证是对的,全当是抛砖引玉。

首先我的观点是java採用的是值传递,即使是引用作为实參也仅仅是将引用的值传递给另外一个引用,说白了还是值传递。

1、首先对于java基本类型(如int,double,byte)和不可变类型如(String)做參数一定是值传递,如以下程序:

public class Config {
public static void main(String[] args) {
int a1=9;
String s1="abc";
System.out.println("改变之前,a1="+a1+",s1="+s1);
Change(a1);
Change(s1);
System.out.println("改变之后,a1="+a1+",s1="+s1);
}
public static void Change(int a2) {
a2=12;
}
public static void Change(String s2) {
s2="def";
}
}

因为參数是值传递,编译器仅仅是将a1、s1的值传递给了a2、s2,当a2、s2的值发生变化时不会影响实參a1、s1的值,所以不变。

2、对于java对象的引用做參数,依旧是值传递

仅仅是此时的值传递,是将一个引用的值传递给还有一个引用,如以下所看到的:

public class Config {
public static void main(String[] args) {
StringBuffer s1=new StringBuffer("abc");
System.out.println("改变之前,s1="+s1);
Change(s1);
System.out.println("改变之后,s1="+s1);
}
public static void Change(StringBuffer s2) {
s2.append("def");
}
}

这时候大家可能就非常疑惑了,为什么在这里s1的值被改变了。

首先我们先明白一个概念,s1是一个引用而不是一个对象。new StringBuffer("abc")是一个对象,它被存放在内存中的堆里面。而s1是对new StringBuffer("abc")的引用,相当于C语言中的指针一样,里面存放着new StringBuffer("abc")的地址,s1被放在内存中的栈里面。s1指向new
StringBuffer("abc"),例如以下:

当s1作为实參时,是将s1的值复制给s2,s2也是一个引用,此时相当于将的s1中存放的地址复制给了s2,此时s2也指向了new StringBuffer("abc"),例如以下:

此时因为s2也存放了StringBuffer("abc")的地址,s2.append("def")相当于直接在StringBuffer("abc")后面插入了“def”,因此输出的s1结果发生了变化。

再看以下这个样例:

public class Config {
public static void main(String[] args) {
StringBuffer s1=new StringBuffer("abc");
System.out.println("改变之前,s1="+s1);
Change(s1);
System.out.println("改变之后,s1="+s1);
}
public static void Change(StringBuffer s2) {
s2=new StringBuffer("def");
}
}

可能大家看到这个结果会更加的不解,这个时候s1为啥没有发生变化呢??

首先,引用s1的值传递给了引用s2,此时s2存放着StringBuffer("abc")的地址,然后s2=new StringBuffer("def")这一步又将StringBuffer("def")的地址赋给了s2,也就是说s2中的地址发生了变化,不再指向StringBuffer("abc"),即s1、s2指向了不同的对象,所以s2之后的操作不再影响到s1。例如以下:

以上纯属个人见解,欢迎各种喷!!

java參数传递方式问题的更多相关文章

  1. Java參数传递方式

    原文:http://blog.sina.com.cn/s/blog_59ca2c2a0100qhjx.html,我作了些改动并添加了一个实例,添加对照 本文通过内存模型的方式来讨论一下Java中的參数 ...

  2. java參数传递机制浅析

    欢迎转载,转载请声明出处! ----------------------------------------- 前言: java语言中,參数的传递仅仅有一种机制.那就是值传递. 举例: 以下将通过几个 ...

  3. C语言函数參数传递原理

    C语言中參数的传递方式一般存在两种方式:一种是通过栈的形式传递.还有一种是通过寄存器的方式传递的. 这次.我们仅仅是具体描写叙述一下第一种參数传递方式,第二种方式在这里不做具体介绍. 首先,我们看一下 ...

  4. ionic新手教程第七课-简要说明几种界面之间的參数传递及优缺点

    截至2016年4月13日19点32分,我公布的ionic新手教程,已经公布6课了, 总訪问量将近6000,平均每节课能有1000的訪问量.当中訪客最多的是第三课有2700的訪客. watermark/ ...

  5. 參数传递(引用,指针,值传递)C++11

    C++中,函数的參数传递方式有值传递.地址传递.传地址有指针和引用方式. 在函数參数中,传地址的理由有: 1.使被调函数能够改动主调函数中的数据对象: 2.传地址能够降低数据拷贝,提高程序运行速度. ...

  6. java课堂练习之可变參数与卫条件

    /*  有人邀请A,B,C,D,E,F 6个人參加一项会议,这6个人有些奇怪.由于他们有非常多要求,已知:  1)A,B两人至少有1人參加会议:  2)A,E,F 3人中有2人參加会议.  3)B和C ...

  7. java 变长參数使用原则

    1.java变长參数用...表示,如Print(String... args){  ... }; 2.假设一个调用既匹配一个固定參数方法.又匹配一个变长參数方法,则优先匹配固定參数的方法 3.假设一个 ...

  8. java -D參数简化增加多个jar【简化设置classpath】

    1.-D<name>=<value> set a system property  设置系统属性. java命令引入jar时能够-cp參数,但时-cp不能用通配符(多个jar时 ...

  9. 【JAVA学习】“-Xmx1024m -Xms1024m -Xmn512m -Xss256k”——Java执行參数(转)

    年轻代 年老代概念 http://jefferent.iteye.com/blog/1123677 JVM的堆的内存, 是通过以下面两个參数控制的  -Xms 最小堆的大小, 也就是当你的虚拟机启动后 ...

随机推荐

  1. zoj1028-Flip and Shift

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=28 题意:有相互交叉的黑白两种颜色的小球,每一个小球每次可以跳两格:问你是否可以 ...

  2. Android - 设置adb的usb连接配置

    设置adb的usb连接配置 本文地址: http://blog.csdn.net/caroline_wendy 把须要測试的手机连接入电脑.通过系统查找USB连接配置,找到厂商ID: 把ID加入进ad ...

  3. HBase数据存储格式

    好的数据结构,对于检索数据,插入数据的效率就会很高. 常见的数据结构 B+树 根节点和枝节点非常easy,分别记录每一个叶子节点的最小值,并用一个指针指向叶子节点.  叶子节点里每一个键值都指向真正的 ...

  4. linux下nginx负载均衡部署

    nginx负载均衡部署 Nginx("engine x") 是一个高性能的 HTTP 和 反向代理 server,也是一个 IMAP/POP3/SMTP 代理server. Ngi ...

  5. 使用JDK自带的工具将中文转换为ascii码

    有时候在MyEclipse中,文件只能保存为“ISO-8859-1”的类型,而这种类型的文件时无法保存中文数据的,那么我们只能将中文数据经过Unicode编码才能往文件中保存,这里可以使用JDK自带的 ...

  6. Usaco 1.3.2 修理牛棚(Barn Repair)

      Barn Repair 题意:在一个夜黑风高,下着暴风雨的夜晚,农民约翰的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假,所以牛棚没有住满. 剩下的牛一个紧挨着另一个被排成一行来过夜. 有些牛棚里有 ...

  7. 【Demo 0008】Java基础-抽象类

    本掌学习要点:       1.  了解抽象类的定义及使用场景:       2.  掌握final修饰的类.方法以及变量作用及用法:       3.  掌握abstract 修饰的类及方法作用及用 ...

  8. 被忽视的TWaver功能(1)

    应客户需求写个Demo,Demo中包括一些经常使用的功能.包括解析JSON数据生成TWaver中的网元和连线.网元右下角带上不同标识的小图标,连线须要是二次曲线.弹出菜单和信息板.跟大家分享下.先上图 ...

  9. 百度贴吧客户端(Android)网络通信行为分析

    百度贴吧安卓客户端网络通信行为分析 本文由CSDN-蚍蜉撼青松[主页:http://blog.csdn.net/howeverpf]原创,转载请注明出处! 一.实验环境与结果概述 1.1 实验环境   ...

  10. 超炫的Button按钮展开弧形动画效果

    ----------------------收藏备用  ------------------------------- 代码下载:http://download.csdn.net/detail/qq2 ...