java方法中传值和传引用的问题是个基本问题,但是也有很多人一时弄不清。

(一)基本数据类型:传值,方法不会改变实参的值。

   public class TestFun {
  public static void testInt(int i){
  i=5;
  }
  public static void main(String[] args) {
  int a=0 ;
  TestFun.testInt(a);
  System.out.println("a="+a);
  }
  }

程序执行结果:a=0 。

(二)对象类型参数:传引用,方法体内改变形参引用,不会改变实参的引用,但有可能改变实参对象的属性值。

  举两个例子:

  (1)方法体内改变形参引用,但不会改变实参引用 ,实参值不变。

   public class TestFun2 {
  public static void testStr(String str){//str是形式参数
  str="hello";//型参指向字符串 “hello”
  }
  public static void main(String[] args) {
  String s="1" ;
  TestFun2.testStr(s);//s是实参
  System.out.println("s="+s); //实参s引用没变,值也不变
  }
  }

执行结果打印:s=1

  (2)方法体内,通过引用改变了实际参数对象的内容,注意是“内容”,引用还是不变的。

         import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set; public class Test {
public void a(Map a,String b)
{
a.put("test", b);
} public void b()
{
Map a = new HashMap();
a.put("test", "a");
String b = "b";
//printMap(a);
a(a,b);
printMap(a);
} public void printMap(Map a)
{
Set set = a.entrySet();
Iterator it = set.iterator();
while(it.hasNext())
{
Map.Entry e = (Map.Entry)it.next();
System.out.println("Key:"+e.getKey()+" Value:"+e.getValue()); }
} public static void main(String avgs[])
{
Test t = new Test();
t.b();
}
}

执行结果,打印:Key:test Value:b 。可见在方法a()内改变了实参的内容。

  (3)第二个例子是拿map举例的,还有经常涉及的是 StringBuffer :

   public class TestFun4 {
  public static void testStringBuffer(StringBuffer sb){
  sb.append("java");//改变了实参的内容
  }
  public static void main(String[] args) {
  StringBuffer sb= new StringBuffer("my ");
  new TestFun4().testStringBuffer(sb);
  System.out.println("sb="+sb.toString());//内容变化了
  }
  }

执行结果,打印:sb=my java 。

  所以比较参数是String和StringBuffer 的两个例子就会理解什么是“改变实参对象内容”了。

  总结:

  第一:java方法基本数据类型是传值,对象类型传引用,这是千真万确的。

  第二:当参数是对象时,无论方法体内进行了何种操作,都不会改变实参对象的引用。

  第三:当参数是对象时,只有在方法内部改变了对象的内容时,才会改变实参对象内容。

转载自http://blog.csdn.net/tianlincao/article/details/6875593

java 函数形参传值和传引用的区别的更多相关文章

  1. php函数形参传值与传引用

    传值 ------------------------------------------------- function example( $m ){     $m = $m * 5 + 10;   ...

  2. php传值和传引用的区别

    php传值和传引用的区别所谓值传递,就是说仅将对象的值传递给目标对象,就相当于copy:系统将为目标对象重新开辟一个完全相同的内存空间.所谓传引用,就是说将对象在内存中的地址传递给目标对象,就相当于使 ...

  3. java中的传值与传引用

    java函数中的传值和传引用问题一直是个比较“邪门”的问题,其实java函数中的参数都是传递值的,所不同的是对于基本数据类型传递的是参数的一份拷贝,对于类类型传递的是该类参数的引用的拷贝,当在函数体中 ...

  4. Python学习笔记之函数参数传递 传值还是传引用

      在学完Python函数那一章节时,很自然的的就会想到Python中函数传参时传值呢?还是传引用?或者都不是? 在回答上面的问题之前我们先来看看下面的代码: 代码1: def foo(var): v ...

  5. 5个php实例,细致说明传值与传引用的区别

    传值:是把实参的值赋值给行参 ,那么对行参的修改,不会影响实参的值 传引用 :真正的以地址的方式传递参数传递以后,行参和实参都是同一个对象,只是他们名字不同而已对行参的修改将影响实参的值 说明: 传值 ...

  6. php中传值与传引用的区别。什么时候传值什么时候传引用?

    值传递:   函数范围内对值的任何改变在函数外部都会被忽略; 引用传递: 函数范围内对值的任何改变在函数外部也能反映出这些修改: 优缺点:按值传递时,php必须复制值.特别是对于大型的字符串和对象来说 ...

  7. Java 函数调用是传值还是传引用? 从字节码角度来看看!

    原文地址:点击打开

  8. Java中的值传递和地址传递(传值、传引用)

    首先,不要纠结于 Pass By Value 和 Pass By Reference 的字面上的意义,否则很容易陷入所谓的“一切传引用其实本质上是传值”这种并不能解决问题无意义论战中.更何况,要想知道 ...

  9. Java经典问题:传值与传引用?

    转自:http://developer.51cto.com/art/201104/254715.htm Java到底是传值还是传引用?相信很少有人能完全回答正确.通常的说法是:对于基本数据类型(整型. ...

随机推荐

  1. C# 读取网络txt文件 并写在本地txt文件中

    public void WriteStream() { try { stirng ImagesPath = ImagesPath + "\\2013-09-27.txt"; Htt ...

  2. 全球AI界最值得关注的十位科学家

    全球AI界最值得关注的十位科学家   我们可以看到AI已经从象牙塔里的高冷研究,逐步转换为科技公司.互联网公司的最核心竞争力.AI代表了这时代人类的前沿智慧,也正达到一种科学的极致. 这两天在美国加利 ...

  3. [LeetCode#157] Read N Characters Given Read4

    Problem: The API: int read4(char *buf) reads 4 characters at a time from a file. The return value is ...

  4. POJ_2100_Graveyard_Design_(尺取法)

    描述 http://poj.org/problem?id=2100 求连续平方和=n的序列个数,并输出序列. Graveyard Design Time Limit: 10000MS   Memory ...

  5. Android Loader详解三:重启与回调

    重启装载器 当你使用initLoader()时,如果指定ID的装载器已经存在,则它使用这个装载器.如果不存在呢,它将创建一个新的.但是有时你却是想丢弃旧的然后开始新的数据. 要想丢弃旧数据,你应使用r ...

  6. POJ -- 2955

    Brackets Description We give the following inductive definition of a “regular brackets” sequence: th ...

  7. TOAD Menu Shortcuts 快捷键

    TOAD Menu Shortcuts Category Command Shortcut Conflict File AWR Browser File Compare Files File DBMS ...

  8. Eclipse插件Subclipse各版本插件下载地址以及与Subverison的对应关系

    Subclipse 1.4.x includes and requires Subversion 1.5.x client features and working copy format. Subc ...

  9. 执行configure报错configure: error: C++ preprocessor "/lib/cpp" fails sanity check

    解决方案: 出现该情况是由于c++编译器的相关package没有安装,以root用户登陆,在终端上执行: # yum install glibc-headers # yum install gcc-c ...

  10. cpp