`

总结Java方法(函数)传值和传引用的问题

    博客分类:
  • Java
 
阅读更多

http://java.chinaitlab.com/base/805647.html

 

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="hello";//型参指向字符串 “hello”

  }

  public static void main(String[] args) {

  String s="1" ;

  TestFun2.testStr(s);

  System.out.println("s="+s); //实参s引用没变,值也不变

  }

  }

  执行结果打印:s=1

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

  import java.util.HashMap;

  import java.util.Map;

  public class TestFun3 {

  public static void testMap(Map map){

  map.put("key2","value2");//通过引用,改变了实参的内容

  }

  public static void main(String[] args) {

  Map map = new HashMap();

  map.put("key1", "value1");

  new TestFun3().testMap(map);

  System.out.println("map size:"+map.size()); //map内容变化了

  }

  }

  执行结果,打印:map size:2 。可见在方法testMap()内改变了实参的内容。

  (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方法基本数据类型是传值,对象类型传引用,这是千真万确的。

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

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

  呵呵,不知道我说清楚了没有

分享到:
评论

相关推荐

    java的传值与传引用详解

     传值还是传引用的问题,到此已经算是解决了,但是我们仍然不能解决这样一个问题:如果我有两个 int 型的变量 a 和 b,我想写一个方法来交换它们的值,应该怎么办?  结论很让人失望——没有办法!因此,我们只能...

    23.Java对象作为参数传递是传值还是传引用1

    前言在Java中,当对象作为参数传递时,究竟传递的是对象的值,还是对象的引用,这是一个饱受争议的话题。若传的是值,那么函数接收的只是实参本,函数对形参的操作并不

    Java语言的方法参数浅析

    大多数程序设计语言具有传值调用和传引用调用的两种方法.通过对典型程序的研究与分析可以看出JAVA语言的参数传递总是传值调用的,但是对于基本类型的参数和对象类型的参数来说,参数传递的情况不完全相同.Java语言不能...

    Java开发技术大全(500个源代码).

    localVSmember.java 局部变量与成员变量同名问题示例 onlyTest.java 对象传值示例 otherClass.java 从类的外部访问对象的成员 showInstVar.java 演示不同的对象拥有不同的成员变量 showMain.java 演示main方法...

    javascript引用赋值(地址传值)用法实例

    javascript在默认情况下,数组、对象和函数是引用赋值,如下代码所示: 代码如下:<html> <head> [removed] var a={age:20,height:175}; var b = a; alert(b.age); b.age = 25; alert(a.age...

    C语言解析教程(原书第4版)(美) 凯利.pdf

    5.7 函数调用和传值调用 5.8 开发大型程序 5.9 使用断言 5.10 作用域规则 5.10.1 平行和嵌套代码块 5.10.2 以调试为目的使用代码块 5.11 存储类型 5.11.1 auto存储类型 5.11.2 extern存储类型 5.11.3 register存储...

    Java中对象的销毁

    Java中的基本数据类型变量和对象的名称引用变量如定义在方法中,都为局部变量。但对象本身不一定是局部生命周期。如函数外存在其他对该对象的引用变量,则该对象的生命周期延伸至该其他引用变量所在的块。  如从...

    C++编程思想 (作者学习C++亲身体会及多年教学经验)

    全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚...

    C++编程思想1-5 清晰PDF

    全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚...

    C++编程思想(中文版)

    全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚...

    c++string类的实现

    3) 有些函数返回的是MyString& 、Char& 等(引用),MyString、Char 等(传值)这得看你返回的对象是函数的局部变量还是全局变量(或者类当前对象成员变量);前者只能返回一个MyString、Char 等;后者强烈建议返回...

    c#学习笔记——学习心得

    可以被这个类或者结构的所有成员函数(方法、构造函数)使用,可以是值类型或引用类型,主要有实例字段和静态字段。区别于局部变量在于局部变量只能被给定的函数或代码块使用 属性:一种用于访问对象或类的特性的成员...

    javascript的变量、传值、传址、参数之间关系

    书上说:”把函数外部的值复制给函数内部的参数,就和把值从一个变量复制给另一个变量一样。基本类型的传递如同基本类型变量的复制一样,而引用类型的则如同引用类型变量的复制一样。“  ”当一个变量复制引用类型...

    Hibernate教程

    17.2. 别名和属性引用 17.3. 命名SQL查询 17.3.1. 使用return-property来明确地指定字段/别名 17.3.2. 使用存储过程来查询 17.3.2.1. 使用存储过程的规则和限制 17.4. 定制SQL用来create,update和delete 17.5....

    asp.net知识库

    动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和...

Global site tag (gtag.js) - Google Analytics