java吧 关注:1,251,133贴子:12,734,536
  • 46回复贴,共1

关于引用传递与值传递

只看楼主收藏回复

结果为什么是 good and gbc


IP属地:北京来自Android客户端1楼2014-07-17 21:12回复
    去看看JAVA的堆区跟栈区吧


    IP属地:浙江4楼2014-07-17 22:50
    回复
      char是引用类型所以会改,string 用new的时候是先在string池中,然后存在堆中。用等于应该只改变了spring池里 而堆中的数据未改变。这是我的理解


      IP属地:浙江5楼2014-07-18 09:25
      回复
        呵呵,这个问题被无数人问过了,翻翻以前的帖子去吧。java只有值传递,没有引用传递。


        6楼2014-07-18 10:30
        回复
          我来给大家科普一下:
          Java中没有指针,所以也没有引用传递了,仅仅有值传递 不过可以通过对象的方式来实现引用传递 类似java没有多继承 但可以用多次implements 接口实现多继承的功能
          值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。
          引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。


          IP属地:江苏7楼2014-07-18 11:35
          回复
            很多人都疑惑的问题,看来对 值传递 认识不够清楚。
            记住一句话:java里面只有值传递,没有引用传递(虽然有点像)。


            IP属地:重庆8楼2014-07-18 11:52
            回复
              放屁。


              来自Android客户端9楼2014-07-18 12:19
              回复
                在java中所有的专递(对象,或者属性)都是引用传递,在change方法中属性字符串str和Example类的属性字符串str并不指向同一个内存(可以认为是java虚拟机重新开辟的内存),所以在change方法中的str和该类中的str根本就是两回事各不相干,只是借用了全局变量的值而已!如果想让引用地址相同可以在change方法中加上关键字this即this.str=“test ok”(你可以试一下看变没变)!同理另外一个就不说了,就是引用的地址一样!


                IP属地:江苏10楼2014-07-18 12:22
                收起回复
                  str = "test ok"; // 你修改了局部变量str的引用,但并没有修改它原本所引用的对象(也就是"good"),所以它原本所引用对象不会变化
                  ch[0] = 'g'; // 你修改了局部变量ch所引用的对象的[0]元素的值,因为这个ch变量与this.ch变量所引用的是同一个对象,所以main中打印ex.ch就会发现它已经变了


                  IP属地:广西11楼2014-07-18 13:09
                  回复
                    写的真乱


                    IP属地:山东来自iPhone客户端12楼2014-07-18 13:52
                    回复
                      首先Sting是引用类型
                      但同时String也是不可变类,String类的源代码中定义是final类型
                      String str = new String("good"); 栈上的引用str 指向堆上的"good"
                      这时"good"所在的内存地址为 地址1
                      在方法中public void change (String str)这里的str是一个新的引用 虽然名字一样 但实际上和类变量str是完全不同的两个引用 为了便于理解我们将后者称为str2(命名对本例没有影响)
                      当你调用change方法并传参 就把str中所储存的地址 传递给了str2
                      也就是 str2 现在所指向的物理地址和str相同 都是堆上的地址1 内容为"good"
                      因为String是不可变类 所以在change()方法中
                      str2="test ok” 此时str2指向新的物理地址 地址2 地址上的内容为"test ok"
                      但str依旧是指向地址1的
                      需要特别说明的一点是 str2=“test ok" 中 "test ok"是存在常量池中的
                      因为这句话并没有新建对象
                      共同学习,如果有不对的地方欢迎大家一起讨论


                      13楼2014-07-18 14:06
                      收起回复
                        好乱,但学习了,这个题是考String的。


                        IP属地:湖北14楼2014-07-18 14:38
                        回复