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

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

  1. public class TestFun {
  2. public static void testInt(int i){
  3. i=5;
  4. }
  5. public static void main(String[] args) {
  6. int a=0 ;
  7. TestFun.testInt(a);
  8. System.out.println("a="+a);
  9. }
  10. }

  程序执行结果:a=0 。

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

  举两个例子:

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

  1. public class TestFun2 {
  2. public static void testStr(String str){
  3. str="hello";//型参指向字符串 “hello”
  4. }
  5. public static void main(String[] args) {
  6. String s="1" ;
  7. TestFun2.testStr(s);
  8. System.out.println("s="+s); //实参s引用没变,值也不变
  9. }
  10. }

  执行结果打印:s=1

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

  1. import java.util.HashMap;
  2. import java.util.Iterator;
  3. import java.util.Map;
  4. import java.util.Set;
  5. public class Test {
  6. public void a(Map a,String b)
  7. {
  8. a.put("test", b);
  9. }
  10. public void b()
  11. {
  12. Map a = new HashMap();
  13. a.put("test", "a");
  14. String b = "b";
  15. //printMap(a);
  16. a(a,b);
  17. printMap(a);
  18. }
  19. public void printMap(Map a)
  20. {
  21. Set set = a.entrySet();
  22. Iterator it = set.iterator();
  23. while(it.hasNext())
  24. {
  25. Map.Entry e = (Map.Entry)it.next();
  26. System.out.println("Key:"+e.getKey()+" Value:"+e.getValue());
  27. }
  28. }
  29. public static void main(String avgs[])
  30. {
  31. Test t = new Test();
  32. t.b();
  33. }
  34. }

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

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

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

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

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

  总结:

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

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

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

java 形参实参的更多相关文章

  1. java形参是否会改变实参

    之前一直对java这方面感到困惑---传入的形参是否会影响实参.因为c++有指针,而java没有,所以我做一个测试验证形参是否会影响实参.* 首先第一种情况---基本类型 哈哈,其实结果大概和我想的一 ...

  2. java——形参与实参

    看了很多的文章,稍微有一些的总结:对最基本的形参与实参有了一定的理解,虽然还是不够深入. 1.基本概念 形参:全称为"形式参数"是在定义函数名和函数体的时候使用的参数,目的是用来接 ...

  3. 关于Java形参和实参的理解

    源码地址:https://github.com/mynawang/javabasic-summary/tree/master/chapter01 1.方法的形参中,java的基本数据类型是传值调用,对 ...

  4. JAVA:形参与实参

    今天百度startWith函数的用法,无意中看到了形参这个称呼,因此就去了解了下形参与实参. 在传值机制中,其实就是把变量b(实参)的地址传递给了形参(也就是实参跟形参都是用的同一个地址,在传值之前形 ...

  5. java中实参与形参的概念

    形参: public void fun(形参类型 形参名){ ... } 实参: public static void main(String[] args){ 类 对象名=new 类(); 对象名. ...

  6. python学习道路(day4note)(函数,形参实参位置参数匿名参数,匿名函数,高阶函数,镶嵌函数)

    1.函数 2种编程方法 关键词面向对象:华山派 --->> 类----->class面向过程:少林派 -->> 过程--->def 函数式编程:逍遥派 --> ...

  7. C语言 01 形参实参

    之前的都在印象笔记记录 continue 结束本轮循环体,进入下一次循环.break 直接结束整个while循环 形参:定时函数时函数名后面中的参数实参:调用函数时传入的具体数据基本数据类型作为形参, ...

  8. day11函数(形参实参)

    形参与实参 def fn(形参们): pass # 形参:定义函数,在括号内声明的变量名,用来结束外界传来的值# 实参:调用函数,在括号内传入的实际值,值可以为常量.变量.表达式或三者的组合 # 注: ...

  9. 关于函数传参的其他问题(const形参实参/可变形参)

    const 形参和实参 当形参是 const 变量时,实参是 const 或者不是 const 变量都可以. 实参初始化形参时会忽略掉顶层 const: void gel(const int a){ ...

随机推荐

  1. poj 1087 最大流

    没啥好说的,慢慢建图 Sample Input 4 A B C D 5 laptop B phone C pager B clock B comb X 3 B X X A X D Sample Out ...

  2. 如何用Linux的命令正确识别cpu的个数和核数【转】

    判断依据: 1.具有相同core id的cpu是同一个core的超线程. 2.具有相同physical id的cpu是同一颗cpu封装的线程或者cores. 英文版: 1.Physical id an ...

  3. 电赛总结(四)——波形发生芯片总结之AD9834

    一.特性参数 1.2.3V~5.5V供电 2.输出频率高达37.5MHz 3.正弦波.三角波输出 4.提供相位调制和频率调制功能 5.除非另有说明,VDD = 2.3 V至5.5 V,AGND = D ...

  4. C++primer学习笔记(一)——Chapter 3

    3.1 Namespace using Declarations 1.因为C++里有名字空间的定义,例如我们使用cin的时候必须写成std::cin,如果就用一次还是可以接受的,但是如果一直都这样,那 ...

  5. Distinct和Group by去除重复字段记录

    重复记录 有两个意义,一是完全重复的记录,也即所有字段均重复的记录 二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略. 1.对于第一种重复,比较容易解决,使用 s ...

  6. Google地图接口API之Google地图 API 参考手册(七)

    Google 地图API 参考手册 地图 构造函数/对象 描述 Map() 在指定的 HTML 容器中创建新的地图,该容器通常是一个DIV元素. 叠加层 构造函数/对象 描述 Marker 创建一个标 ...

  7. 斐波那契数[XDU1049]

    Problem 1049 - 斐波那契数 Time Limit: 1000MS   Memory Limit: 65536KB   Difficulty: Total Submit: 1673  Ac ...

  8. !cocos2d 重复添加action事件

    当点击的时候,如果不是按照开始点击计算的,那么持续点击会导致不会变大. void Piece::setActived(bool active) { _actived = active; CCActio ...

  9. Shell 之数组 [转]

    本文也即<Learning the bash Shell>3rd Edition的第六章Command-Line Options and Typed varilables之读书笔记之三,但 ...

  10. (转载)c# winform 用子窗体刷新父窗体,子窗体改变父窗体控件的值

    第一种方法: 用委托,Form2和Form3是同一组 Form2 C#代码 using System; using System.Collections.Generic; using System.C ...