黑马程序员技术交流社区

标题: 关于基本数据类型和应用数据类型的值参数传递问题 [打印本页]

作者: 周玉龙    时间: 2012-7-18 00:02
标题: 关于基本数据类型和应用数据类型的值参数传递问题
传递的是基本数据类型时,形参的改变对实参不影响。
传递的是引用数据类型时,形参的直接影响实参。

public class ReferenceType {  
  public void testPassByStirng(String param) {  
  param = "newValue";  
  }  
  public static void main(String[] args) {  
  String param = "value";  
  test.testPassByStirng(param);  
  System.out.println(param); // 结果是value ,而不是 newValue,为什么?String应该是引用数据类型,为什么他的形参的改变对实参也没有影响?
  }  
  }  


作者: 王龙彪    时间: 2012-7-18 00:10
String类的对象在内存中是不会变的
你的函数中给param赋值
本质上是在内存中新建了个字符串
然后再把原来的引用指向新生成的字符串
main()里的param的引用是没有变的
作者: 康大玮    时间: 2012-7-18 00:15
首先你的代码不对,如果你的代码对因为param是局部变量,你要理解作用域和生命周期
打个比方for(int i=0;i<10;i++){ ....}   ,i就是局部变量它的作用域只是在for循环里面,它的生命周期等到for循环结束就终止。
作者: 乞文超    时间: 2012-7-18 00:41
java的参数传递都是以值的形式传递
如果是基本数据类型传递的就是数据本身int   a=1 当调用  acv(a)时传进的就是1
如果是对象传导函数中的就是函数的内存地址而不是对象本身
相对于string类型   传进去的是string的一个引用
即生成一个指向原string内存地址的引用
此时两个引用都指向同一块内存
对这个引用重新赋值后就指向新的内存地址   
但是主函数中的变量的指向地址是不变的
作者: 周坤    时间: 2012-7-18 01:19
java中方法调用的参数传递方式是传值,即方法调用不会改变调用程序中作为方法参数的变量的值。
public class ReferenceType {  
         public void testPassByStirng(String param) //param为形参,作用域为这个方法里。
         {  
                 param="new value";//此时的param指向新的字符串"new value",但这并不会影响main()方法中的param。
         }  
         public static void main(String[] args)
         {
                 ReferenceType test=new ReferenceType();
             String param = "value";  
             test.testPassByStirng(param);  //这个方法结束后,形参param就释放了,而主函数里的param指向的仍然是value。
             System.out.println(param);//结果是value ,而不是 newValue,为什么?因为引用传递,传递的是引用的地址,也就是value的地址。当改变时,只是形参对应的地址改变了,它随着方法体结束便释放了,而主函数的param依然指向原来的地址。
        }
}

只有引用传递中,对指向的对象进行修改,比如改变对象成员变量的值,这种改变将是永久的改变。





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