读书人

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

发布时间: 2012-05-04 12:36:09 作者: rapoo

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

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){..}


public void test1(){ int i = 0 ; test(i);};在运行调用test方法时,栈中会存放两个为0的整数,一 个是i,一个用于调用test方法。

java中对象,数组调用时也是如此,不同的是对象,数组存放在栈中不是它原有的值而是一个地址,这就是人们说的地址引用.这是因为java会将对象,数组存放在堆内存当中,当运行时就只会给一个堆的地址引用。
比如 privatevoid test(User user){
user.setName("aaaa");
}
public void test1(){
User uesr = new User();
test(user);
}
初始话user时,在栈中不是存放的user对象,而是在堆中初始化一个对象,并将对象的地址引用给了栈中的user。 假设堆中的地址为"123", 这是,栈中user对应的就是“123”这个地址,当调用test时,会在栈中产生两个user出来,但是他们都对应"123"这个地址,因此修改一个。另一个也会被修改掉.但是重新给他一个地址引用,以前的的数据不会被修改,这就是StringBuffer出现的情况.

另外一种情况,就是final关键字的使用,String 对象在JDK中使用final修饰,也就代表它不能被修改,只能被复制,因此java在实现的时候,实际是在堆中New了一个string出来,你可以简单的认为buffer2的过程,只不过它是有JVM实现。

[解决办法]
都是传引用

只是String类,很特别。 已经提醒过很多次哦,String类长度是固定的

str+="world";
//你认为是字符串变长了,但是实际上str已经变成了新的引用地址了
//而原来地址的值并没有改变

所以这和传值与传引用无关。 只是你没有理解String类而已

读书人网 >J2SE开发

热点推荐