A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-陈思源 中级黑马   /  2013-3-4 08:13  /  2212 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马-陈思源 于 2013-3-6 12:43 编辑

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 鼓励鼓励

查看全部评分

14 个回复

倒序浏览
这是引用传递,对象的属性可能会被这个方法改变。
回复 使用道具 举报
当然是引用传递,你都说了是把对象作为参数传递给方法,而不是变量。
回复 使用道具 举报
是引用传递,实际是把该对象的地址作为实际参数传给了函数
回复 使用道具 举报
额。。。我改听谁的   - -#
回复 使用道具 举报
本帖最后由 彭波 于 2013-3-4 09:17 编辑

是值传递。

      Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
给你个程序看看,这个例子是从网上看到的,希望对你有帮助
public class Abc
{ int a;
  int b;  
  
  Abc(int x, int y)
  {//构造方法,就本体而言对象a的成员变量a=5,b=6  
    a = x;  
    b = y;
   }  
   
  int add()  
  {// 此方法实现的是对象a的成员变量a,b的加法  
    int s;  
    s = this.a + b;  
    return s;  
  }
   
  int add(int a, int b)
  {//此方法实现的是传入参数a,b的加法  
   return a + b;//a,b是参数,与成员变量无关,这是因为a,b是局部变量
   }
   
   public static void main(String[] args)
   {  Abc a = new Abc(5, 6);  
      System.out.println("add1的结果:a+b=" + a.add());
      System.out.println("add2的结果:a+b=" + a.add(7, 8));  
   }
}

结果是:add1是11
           add2是15
回复 使用道具 举报
本帖最后由 小李 于 2013-3-4 12:05 编辑

是引用传递! 下面写个简单例子来说明:
class ReferenceTest{
      static void aaa(ReferenceTest arg){
      ...  // 各种代码
      }

      public static  void main(String[] args){
      ReferenceTest rt1=new ReferenceTest();
      aaa(rt1);
      }
}
aaa(rt1)会把rt1的引用传递给aaa方法,不管aaa方法里面怎么操作arg,rt1这个引用是不会变的,永远指向ReferenceTest rt1=new ReferenceTest();这里创建的那个对象。
aaa方法里改变arg的属性,会真实的改变rt1对象的属性。
如果要限制aaa方法改变rt1对象的属性,可以声明aaa方法时对参数声明final

以上是在下自己的愚见,如有不妥,还请大神们赐教!!!
回复 使用道具 举报
..............我晕了  {:soso_e141:}
你们有的说是引用类型,有的说是值类型,而且每个人说的,我看着好像都有道理似的。。。。
求大神指示啊   0.0
回复 使用道具 举报
同学:
这是引用类型传递,,对象是引用数据类型,,,和string一样的,,,,基本数据类型是值传递,,实际上你那个方法里的形式参数接收的是个对象的引用,,就是对象的内存地址值赋给了你那个形式参数,,,那么形式参数有了这个地址值后就会指向那个对象,,,,你指向那个对象后就可以修改对象里面的属性了,,,,在后面的学习当中,,,传递数据我们一般会把数据封装成对象来传递,,,这样效率高,方便....

同学你可以自己画个内存图那样方便你直观的理解,,,,你可以跟着毕老师画个内存图,,,你画完后就感觉so easy
回复 使用道具 举报
  1. public void add(String s)
  2. {
  3.     System.out.println(s);
  4. }
复制代码
多数是引用传递。对于上边的方法add,如果你传进的是String s1="abc"中的s1(引用传递),或者“efg”这样的值(值传递),对着前者,是把s1指向的地址赋值给add参数中的s,对于后者是把“efg”它在内存中的地址赋值给s,方法体内部操作的也是s。他们传递都是引用的地址。什么时候会出现值传递?如果上边的add方法中的参数不是String,而是八种基本数据类型,那么它传递的就是值。可以这样来总结:方法的参数是基本数据类型,它传递的是值;方法参数引用数据类型,它传递的是引用。
回复 使用道具 举报
本帖最后由 谢洋 于 2013-3-5 00:05 编辑

不用说得那么复杂吧
引用,即地址,而地址所指向某空间,空间的内容可以说是对象的一些数据了;
打个比如:你叫我修理你家里的某个东西(对对象的成员的操作),那么我必须得到你家的地址才行(把地址传来),我就可以找到你家了;
要不然你得把你家的东西搬过来,你可以这样做;但jvm不是这样子干的,因为jvm好像就一个吧,还能叫谁传给它搞呢?
不会自已都找到东西,然后再传给自已,搞完了又叫自己再搬回去原来那里,没有那么疯狂吧
回复 使用道具 举报
给你一张图吧,你看了就明白了。


赋值.PNG (422.92 KB, 下载次数: 20)

赋值.PNG
回复 使用道具 举报
是引用传递,如果把整个对象的数据作为参数传递,多费力啊,直接传递一个引用,然后方法通过引用找到对象。
就好比有人送你一套房子,那么真正交到你手里的是一把钥匙(房子地址),而不是一套房子,你再根据地址就找到了。
回复 使用道具 举报
谢谢大家。原来是这样 {:soso_e113:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马