热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

String和Integer传递给方法时到底是不是传递引用??!!请看我的例子

publicclassTestString{publicstaticvoidmain(String[]args){TestStringmyTsnewTestString();
public class TestString{
public static void main(String[] args){
TestString myTs=new TestString();

myTs.run();

}

private void run(){
String ts=null;
Integer i=new Integer(0);
System.out.println("Before the change ts and i respectively equals "+ts+","+i.intValue());
changeTs(ts,i);
System.out.println("After the change ts and i respectively equals "+ts+","+i.intValue());
}

private void changeTs(String ts,Integer i){
ts="Something";
i=new Integer(1);
System.out.println("During the changing process ts and i respectively equals "+ts+","+i.intValue());
}
}

20 个解决方案

#1


在java里面只要是对象就应该是引用传递,除此之外的int,float,double等类型是值传递,但是我的例子中String和Integer不是引用传递,在方法里面改变了它们的值,但是方法调用完后,它们的值依然没有变。

#2


关注一下有没有合理的解释
数组是会变的,呵呵

#3


值没有改变,说明它们是值传递,这有什么问题吗?

#4


private void run(){
String ts=null;  //这里ts为null,它没有指向任何内存,怎么会变呢??
Integer i=new Integer(0);
System.out.println("Before the change ts and i respectively equals "+ts+","+i.intValue());
changeTs(ts,i);
System.out.println("After the change ts and i respectively equals "+ts+","+i.intValue());
}

private void changeTs(String ts,Integer i){
ts="Something";  //要知道这里的ts和上面的ts是两个指针,这个指向了一个内存,但原先的ts指向的是null,也就没有改变一说了...
i=new Integer(1); //这里你给i有新开辟了一块内存,这个i变了,但原来还是指向自己的地址..
System.out.println("During the changing process ts and i respectively equals "+ts+","+i.intValue());
}

修改后:
private void run(){
String ts="one";
Integer i=new Integer(0);
System.out.println("Before the change ts and i respectively equals "+ts+","+i.intValue());
changeTs(ts,i);
System.out.println("After the change ts and i respectively equals "+ts+","+i.intValue());
}

private void changeTs(String ts,Integer i){
ts="Something";
i= ... //你的例子太特殊,Integer没有改变的方法 :(
System.out.println("During the changing process ts and i respectively equals "+ts+","+i.intValue());
}

现在你看你的ts是否变化了??

 ------------------------------------------------------
           我们还年轻牛奶会有的奶牛也会有的 
             可天天在 csdn 混这些会有吗 ??

#5


楼主 首先说明一下在JAVA中所有的对象传递都是引用传递。
代码分析:
一.在run()方法调用changeTs(String ts,Integer i)时  String ts=null;注意ts=null字符 串ts并没有被实例化,所以ts只是一个没有指向任何内存地址的空指针。
二.方法changeTs(String ts,Integer i)中ts="Something"; i=new Integer(1); 
首先"Something" 代表了一个在内存中分配了地址的字符串, 语句ts="Something"; 将ts空指针指向"Something",注意是将ts指针指向"Something" 而不是改变ts指针所指向内存地址的内容。

你可以试一下将String 该成Label  代码如下:
public class TestString{
public static void main(String[] args){
TestString myTs=new TestString();

myTs.run();

}

private void run(){
 Label ts= new Label();
Integer i=new Integer(0);
System.out.println("Before the change ts and i respectively equals "+ts.getText()+","+i.intValue());
changeTs(ts,i);
System.out.println("After the change ts and i respectively equals "+ts.getText()+","+i.intValue());
}

private void changeTs(Label ts,Integer i){
ts.setText("Something");
i=new Integer(1);
System.out.println("During the changing process ts and i respectively equals "+ts.getText()+","+i.intValue());
}
}



#6


to:zez(思恩 为老婆多挣钱 鹤清风) 
试过了,你这样字符串的值还是没有改变的

#7


changeTs(ts,i);
这里传进去的只是ts和i的一个副本!

#8


除了数组、BufferString之类的都是值传递。
出了函数变会原来的值

#9


JAVA中所有的对象传递都是引用传递
前提就是句柄只是对象的一个“别名”,
                参见《java编程思想》

#10


i=new Integer(1)
这种使用是采用了Integer包装类的技术,1是按值传递到Integer类中的

Integer类大概象:

class Integer
{  
   private int i;
   Integer(int i)
   {
     this.i=i;
   }
   public int intValue()
   {
     return this.i;
   }
  ........
}

#11


谁能给合理解释??

#12


String是值传递,Integer是引用传递。

#13


java中只有String类的对象和基本数据类型是值传递,其他类的对象是引用传递。

#14


public class TestString{
public static void main(String[] args){
TestString myTs=new TestString();

myTs.run();

}

private void run(){
 object1 ts= new object1(1);
object2 i=new object2(1);
System.out.println("Before the change ts and i respectively equals "+ts.getText()+","+i.intValue());
changeTs(ts,i);
System.out.println("After the change ts and i respectively equals "+ts.getText()+","+i.intValue());
}

private void changeTs(Label ts,Integer i){
ts.a=2
i=new object(2)
System.out.println("During the changing process ts and i respectively equals "+ts.getText()+","+i.intValue());
}
}
object1,object2是一个对象有一个int的属性。
你会发现object1改变了,而object2没变!
这是因为在方法里面是局部变量,作用域在方法内部!
与外部的是两个不同的变量!开始的时候是同一个引用!

#15


这个问题其实非常简单:
因为String类型的对象将数据存储在一块连续的存储空间中
如:
String s1="aaaa";//“aaaa”是连续存放的
所以每此给s1赋值的时候(为了保证字符串放在连续的存础空间中),都会重新为它分配存储空间,也就是说以前的存储空间就会丢掉
举个例子
String s1="aa";//假设s1的地址是"0000"
String s2;
s2=s1;//s2的地址是"0000";(s1将引用传给s2)
s1="bb";//重新为s1分配内存空间
System.out.println("s2");//打印出来的是"aa"

#16


参见:
http://expert.csdn.net/Expert/topic/1760/1760533.xml?temp=.7156946
应该很明了的。

#17


所有的类只有String是值传递,其他都是引用

#18


呵呵,我的一点疏忽...
String类是不变类,你的ts="aaa"相当于ts= new String("aaa"),也就是重新开辟一块内存,内容为aaa,ts指向它... 所以你的方法里给ts赋值,原来的ts还是原来的ts...

ts="one" 相当于                   ts--->"one"
方法体引用ts,要知道,
方法体内的ts是原ts的副本,这时     原ts---->"one"
                                             |
                                  副ts-------| 即副ts也指向了"one"
好,现在执行方法,副ts="bbb"这时:
                                  原ts---->"one"
                                             
                                  副ts---->"bbb"
看到了吧,原ts根本没变 !!!
至于Integer,我没找到改变它的值的方法,好像也是不变类? 我不确定 :)

对于其他情况,比如 Class  Test{ 
                                int i; 
                                Test(i){this.i=i;}
                             }  //只是示意 :)
这时的情况呢,把你原程序的String换成 Test.则
开始: Test ts = new Test(0);   即 ts-----> Test.i=1;
方法体引用ts,要知道,
方法体内的ts是原ts的副本,这时     原ts----> Test.i=1;
                                             |
                                  副ts-------| 即副ts也指向了同一个地址
好,现在执行方法ts.i=2; 这时:
                                  原ts---->"one"
                                             |
                                  副ts-------|注意,修改的是副ts指向的内存的值!!也即原ts指向的地址 !!!
看到了吧,原ts现在变了...


 ------------------------------------------------------
           我们还年轻牛奶会有的奶牛也会有的 
             可天天在 csdn 混这些会有吗 ??

#19


好,现在执行方法ts.i=2; 这时:
                                  原ts------>Test.i=2
                                             |
                                  副ts-------|  注意,修改的是副ts指向的内存的值!!也即原ts指向的地址 !!!
看到了吧,原ts现在变了...


 ------------------------------------------------------
           我们还年轻牛奶会有的奶牛也会有的 
             可天天在 csdn 混这些会有吗 ??

#20


总是看见有一撮人十分肯定的说java的对象是传引用的,不知道这些人的真实意图。
那个谁谁,不要再这里误导新手。建议大家去看官方文档。是英文的,看不懂就记住结论吧,java里面参数是传值的。
http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html

When the argument is of reference type, pass-by-value means that the method cannot change the object reference, but can invoke the object's methods and modify the accessible variables within the object. 
当参数是引用类型时,你能通过调用该引用所指向的对象本身的方法来改变对象自身,但是,你并不能改变该引用。(你改变的只能是引用所指向的对象,而不是引用。所以,仍然是值传递。)

#21


  • Java String对象以“引用”方式被传递

推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
author-avatar
幸运幸福一家人1314_332_887
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有