黑马程序员技术交流社区

标题: 求解,面向对象有点糊涂 [打印本页]

作者: 刘峰    时间: 2013-3-6 13:36
标题: 求解,面向对象有点糊涂
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?为啥?
作者: 彭波    时间: 2013-3-6 13:47
老问题,是值传递,java编程只由值传递参数,当一个对象实例作为一个参数被传递到方法中时,参数值就是对该对象的引用,对象的内容可以在被调用的方法中改变,但是对象的引用是永远不会改变的
作者: scott0610    时间: 2013-3-6 13:56
JAVA值传参与引用参数
参数根据调用后的效果不同,即是否改变参数的原始数值,又可以分为两种:按值传递的参数与按引用传递的参数。按值传递的参数原始数值不改变,按引用传递的参数始数值改变!这是为什么呢?其实相当简单:我们知道基本数据类型的变量存放在栈里面,变量名处存放的就是变量的值,那么当基本数据类型的变量作为参数时,传递的就是这个值,只是把变量的值传递了过去,不管对这个值如何操作,都不会改变变量的原始值。而对引用数据类型的变量来说,变量名处存放的地址,所以引用数据类型的变量作为传参时,传递的实际上是地址,对地址处的内容进行操作,当然会改变变量的值了!

经典实例
public class StringTest {

  public static void main(String[] args) {
     
    String stu_Name = "zhangsan";
    StringTest st= new StringTest ();
     
    System.out.println("方法调用前:" + stu_Name);
    st.strChange(stu_Name);
    System.out.println("方法调用后:" + stu_Name);
  }
   
  public void strChange(String str) {
    str = "lishi";
    System.out.println("方法体中的str:" + str);
  }
}


结果:
方法调用前:zhangsan
方法体中的str:lishi
方法调用后:zhangsan
作者: 谢洋    时间: 2013-3-6 13:57
是引用(对象的地址),透过引用,就可找到对象,然后被调用方法就可以对象的数据进行操作了
作者: 李永科    时间: 2013-3-6 14:15
在你开始学习java的时候,书上或者视频里就会说,基本数据类型是值传递,对象传递时引用传递;
当对象作为参数传递的时候就是引用传递了,就好比是将此对象的指针传递了过去,而值传递是将值的一个副本(创建一个内容相同的对象进行传递)传递了过去,对副本的操作而不会影响原来的值;引用传递只是将只想对象的指针传递了过去,此时在内存中只有一个对象,通过引用操作对象的话,也将会影响对象的内容;
作者: 肖明凯    时间: 2013-3-6 14:26
关键还是要看你怎么理解“引用”和“引用传递”。
1.从编译原理的角度讲,所有那些无法通过形参来修改实参本身的传递机制都是“值传递”,在JAVA中,你只能通过在形参上调用方法来
修改实参所引用的那个对象,却修改不了实参本身(不能使它引用到另个对象):
  1. void f(ArrayList list) {
  2.    list = new ArrayList();    //list不影响外边的实参。
  3. }
复制代码
所以从这个角度,JAVA中根本就没有“引用传递”。
2.在JAVA中,除了内建类型的变量,“一切都是引用”,所以传递一个非内建类型的参数,当然也就是传递一个引用,
所以,也可以说JAVA中所有的(除非内建类型)参数传递又“都是引用传递”。
作者: 黑马-王鹏    时间: 2013-3-6 14:56
我觉的是值传递。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。对象是引用传递 ,也就是你传递过去的只是一个地址,而程序只会去调用该地址下的值, 所以当该对象作为一个参数传递给一个方法,并且该方法对该对象进行更改了,则除了该方法,该对象的值不是原来进方法之前的了,而是改变的了。一个对象实例作为一个参数被传递到方法中参数的值就是对该对象的引用。
作者: 贾振凯    时间: 2013-3-6 15:36
其实归根结底都是值传递,基本类型数据传递副本,引用类型传递地址!

作者: 贺华川    时间: 2013-3-6 16:01
就是传值。。{:soso_e100:}
作者: 刘峰    时间: 2013-3-7 08:48
谢洋 发表于 2013-3-6 13:57
是引用(对象的地址),透过引用,就可找到对象,然后被调用方法就可以对象的数据进行操作了 ...

不是引用传递
作者: 刘峰    时间: 2013-3-7 08:54
黑马-王鹏 发表于 2013-3-6 14:56
我觉的是值传递。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。对象是引用传递 , ...

正确,昨天看了下 。明白了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2