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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

传递的是基本数据类型时,形参的改变对实参不影响。
传递的是引用数据类型时,形参的直接影响实参。

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应该是引用数据类型,为什么他的形参的改变对实参也没有影响?
  }  
  }  

4 个回复

倒序浏览
String类的对象在内存中是不会变的
你的函数中给param赋值
本质上是在内存中新建了个字符串
然后再把原来的引用指向新生成的字符串
main()里的param的引用是没有变的
回复 使用道具 举报
首先你的代码不对,如果你的代码对因为param是局部变量,你要理解作用域和生命周期
打个比方for(int i=0;i<10;i++){ ....}   ,i就是局部变量它的作用域只是在for循环里面,它的生命周期等到for循环结束就终止。
回复 使用道具 举报
java的参数传递都是以值的形式传递
如果是基本数据类型传递的就是数据本身int   a=1 当调用  acv(a)时传进的就是1
如果是对象传导函数中的就是函数的内存地址而不是对象本身
相对于string类型   传进去的是string的一个引用
即生成一个指向原string内存地址的引用
此时两个引用都指向同一块内存
对这个引用重新赋值后就指向新的内存地址   
但是主函数中的变量的指向地址是不变的
回复 使用道具 举报
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依然指向原来的地址。
        }
}

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

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马