论坛首页 招聘求职论坛

关于java值传递的问题,图解直观,若您有有高见请斧正!

浏览 11581 次
精华帖 (0) :: 良好帖 (13) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-06-28  
JE帐号 写道
... ...
两段代码,又不相似.没什么可对比的,如果第二段代码的method方法为以下
static void method(String[] a){//12   
   a = new String[]{"1","2"};
} 

在这种情况下如果两段代码结果表现不一样,才有意思.
现在你两个例子里,一个是对传入的参数进行=操作,另一个是对传入的参数里的元素进行=操作.这又什么好对比的?

是呀,Java对象、简单类型的数组均是传址的,简单类型(含string)都是传值的。这个不难理解。用过C语言指针的理解起来无须费力。还画个图搞这么复杂干嘛呀?
0 请登录后投票
   发表时间:2011-06-28  
发的文章不进行过滤吗?两段代码根本没有可比性啊!
0 请登录后投票
   发表时间:2011-06-28  
牢记pass by value就行了吧,这个应该不用分析堆栈的吧
0 请登录后投票
   发表时间:2011-06-28  
brown802 写道
发的文章不进行过滤吗?两段代码根本没有可比性啊!

的确,2段代码中处理的方式都不一样,一个是new,一个是重新赋值。
0 请登录后投票
   发表时间:2011-06-28  
i.phoenix 写道
JE帐号 写道
... ...
两段代码,又不相似.没什么可对比的,如果第二段代码的method方法为以下
static void method(String[] a){//12   
   a = new String[]{"1","2"};
} 

在这种情况下如果两段代码结果表现不一样,才有意思.
现在你两个例子里,一个是对传入的参数进行=操作,另一个是对传入的参数里的元素进行=操作.这又什么好对比的?

是呀,Java对象、简单类型的数组均是传址的,简单类型(含string)都是传值的。这个不难理解。用过C语言指针的理解起来无须费力。还画个图搞这么复杂干嘛呀?

String跟普通引用类型完全一样。大大自己的理解就是错的还说别人么
0 请登录后投票
   发表时间:2011-06-28  
haidii 写道
so easy
java的对象都是引用。
第一个只是把引用的地址改了,原来的字符串没变。
第二个是数组,数组是直接引用地址。
就这么简单。

正解.
0 请登录后投票
   发表时间:2011-06-28  
对象和值,对象是引用,值是赋值
0 请登录后投票
   发表时间:2011-06-28  
如果你愿意欣赏汇编的话,你会发现,本来就应该是这样的
0 请登录后投票
   发表时间:2011-06-28  
其实只要弄清楚
String ss = "abc";

String sss = new String("abc")
的区别就很容易理解了
0 请登录后投票
   发表时间:2011-06-28  
dotjar 写道

 两段代码,结果的差异,请结合代码给图解下内存和执行过程。
  万分感谢!

    public class PassAddr {  
        public static void main(String[] args) {  
            String s=new String("old");  //1
            method(s);  //3
            System.out.println(s);  
        }  
        static void method(String str){  
            str=new String("new");  //2
        }  
    }  

这个输出结果为:old

    public class T { 
        public static void main(String[] args) { 
            String[] arr=new String[2]; 
            arr[0]="old_0"; 
            arr[1]="old_1"; //11
            method(arr); //14
            System.out.println(arr[0]+";"+arr[1]); 
        } 
        static void method(String[] a){//12 
                a[0]="new_0"; 
                a[1]="new_1"; //13
            } 
    } 

 

这个输出却是:new_0;new_1
-------------------------------------------

自己发的问题,想了半天想通了。解析下,希望各位斧正!
===================================

string://1处时:

//1处时候

//2处时:

//2处时候

//3处:

由于方法调用已经完成,所以str临时变量在stack中消失,s还是0x001,其地址处对象new String("old")没有被动;所以输出结果还是old;

---------------------------------------------------固执的分割线------------------------------------------------------

//11处内存状态:

//11处

//12处:

//12处

//13处时候的内存状况:

//13处

此时a[0]和a[1]的值被改变,其实就是arr的相应值改变了。最后就出现了结果如图://14

//14

所以就出现结果改变的情况了。

这么一作图,很直观了。

两个例子没有对比性,str在方法new了,而数组没有在方法内new

0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics