当前位置: 代码迷 >> J2SE >> 从小题目看大有关问题(求各种探讨)
  详细解决方案

从小题目看大有关问题(求各种探讨)

热度:34   发布时间:2016-04-24 01:10:12.0
从小题目看大问题(求各种探讨)
主要是关于基本数据类型和引用数据类型的问题,大家请看题目:

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){..}
  相关解决方案