日期:2014-05-20  浏览次数:20680 次

从小题目看大问题(求各种探讨)
主要是关于基本数据类型和引用数据类型的问题,大家请看题目:

Java code


public class Test
{
    public void change(String str,char[] c,StringBuffer buffer1,StringBuffer buffer2)
    {
        str+="world";    
        c[2]='d';        
        buffer1.append("AAA");
        buffer2=new StringBuffer("BBB");
    }
    
    /**
     * @param args
     */
    public static void main(String[] args)
    {
        Test t=new Test();
        
        String str="hello";        
        char[] c={'a','b','c'};
        StringBuffer buffer1=new StringBuffer("aaa");
        StringBuffer buffer2=new StringBuffer("bbb");
        
        t.change(str, c, buffer1,buffer2);
        
        System.out.println(str);
        System.out.println(c[2]);
        System.out.println(buffer1);
        System.out.println(buffer2);
    }
}




------解决方案--------------------
这个例子比较好的阐释了java是值传递的,对象作为参数时,可以改变对象的属性,但不可改变对象的内存地址,String是final 型的,你可以把它当做基本类型一样用
------解决方案--------------------
楼主还是提出些具体问题,要不大牛不爱看的 ~~
------解决方案--------------------
探讨

这个例子比较好的阐释了java是值传递的,对象作为参数时,可以改变对象的属性,但不可改变对象的内存地址,String是final 型的,你可以把它当做基本类型一样用

------解决方案--------------------
探讨

这个例子比较好的阐释了java是值传递的,对象作为参数时,可以改变对象的属性,但不可改变对象的内存地址,String是final 型的,你可以把它当做基本类型一样用

------解决方案--------------------
LZ先理解好什么是变量,什么是对象
再理解好方法的栈以及变量的内存空间和对象的内存空间的关系
这个问题就本就迎刃而解了

Java code
public class Test
{
    public void change(String str,char[] c,StringBuffer buffer1,StringBuffer buffer2)
    {
       //LZ想想看,这个str是什么,是变量还是对象?"word"又是什么,它和main的str又是什么关系?
        str+="world";  //这个是改变变量的指向,让变量指向新的对象,但不影响main的str的指向  
        c[2]='d'; //这个是改变变量指向的对象的属性,所以main的c也能知道对象的属性改变了   
        buffer1.append("AAA"); //这个也是改变变量指向的对象的属性
        buffer2=new StringBuffer("BBB"); //这个是改变变量的指向,让变量指向新的对象
    }
    
    /**
     * @param args
     */
    public static void main(String[] args)
    {
        Test t=new Test();
        
        String str="hello";        
        char[] c={'a','b','c'};
        StringBuffer buffer1=new StringBuffer("aaa");
        StringBuffer buffer2=new StringBuffer("bbb");
        
        t.change(str, c, buffer1,buffer2);
        
        System.out.println(str);
        System.out.println(c[2]);
        System.out.println(buffer1);
        System.out.println(buffer2);
    }
}

------解决方案--------------------
你学过c/c++把 其实就是
指针传递问题 + String不变对象概念
指针传递就是值传递(区别与引用传递)-其实就是传地址 

1.java中String是不变的就是说 new出来后不能直接修改其内部数据.只能生成新的对象.
str+="world" //生成了新的对象,但是main中还是指向原来的对象
c[2]='d'; //java中其实数组就是一个对象 而且main传递的也是指针
buffer1.append("AAA"); //对象内部数据被改变
buffer2=new StringBuffer("BBB"); //对象内部数据被改变

其实可以详细看一下 scjp的教材开头对参数传递的描述.
java的引用 其实从表面上可以看作指针

------解决方案--------------------
8楼的讲解很详细,我以前也看到他的才豁然开朗,话说你放形参看做一个拷贝,也就是对象引用,就好理解多了。不要看做对象传递,是引用传递。
------解决方案--------------------
其实 还是建议搂主仔细看一下 基础教程...里面有...


------解决方案--------------------
这个问题的本质就是java数据类型的底层实现与final关键字的问题.

java在方法调用是,所有的参数都是copy一份出来,将copy后的数据做参数,调用方法。
比如 private void test(int a){..}