首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

JAVA引用、非引用[初学者求解]

2012-12-17 
JAVA引用、非引用[菜鸟求解]public static void main(String[] args) {testMethod()}public static void t

JAVA引用、非引用[菜鸟求解]


public static void main(String[] args) {
testMethod();
}

public static void testMethod() {
String i = new String("a");
String k = new String("b");
StringBuffer a = new StringBuffer("AAA");
StringBuffer b = new StringBuffer("BBB");
setMethod(a, b);
setMethod(i, k);
System.out.println(a);
System.out.println(b);
System.out.println(i);
System.out.println(k);
}

public static void setMethod(StringBuffer a, StringBuffer b) {
a.append("BBBCCC");
b.append("AAADDD");
}

public static void setMethod(String a, String b) {
a = "10";
b = "20";
}

输出结果:

AAABBBCCC
BBBAAADDD
a
b

stringbuffer是进行引用传递,string是值传递?这个解释对吗?
不是说只要new一个对象,就能得到一个引用,为什么我在用string给值后,应该是更新引用区域的值,为什么没有被更新掉!!!
[最优解释]
java 是按值传递的,所有的对象都是。没有引用传递一说。

这里的值是指引用地址的值。

public static void setMethod(String a, String b) {
        a = "10";
        b = "20";
    }
这里的 a= "10",是指将对象a的地址又赋给 "10"这个字符串的地址去了。

但是 外同的a和这里的a,并不是同一个对象,它们只不过是恰好共享了同一个内在而已。你现在把里面的a的内存指向改了,但这个改变不了外面的对象的指向的。

上面的解释从C++来解释,理解很抽象,但这是java的精粹,你不了解这个。其他的很多都不会了解的。

在java中 =从来都是修改该对象的值所在的地址,即不能改变对象本身的值的。

比如:
a = b;
a = c;
原来的b还是b,而a只不过转向c的地址去了而已。

而你上面的stringbuilder,他的append方法,是修改自己内部的属性,并没有修改自己的地址引用,这个对象的引用还是原来的那一个。

对象重新赋值和修改属性,这两个操作要分开理解。

[其他解释]
LZ,首先我也和你纠正一下,在java中,传递的都是按值传递,没有传地址的说法,因为在java里面,对与引用的话,传的是地址的值。
这里和 引用的关系不是很有关。
为什么会打印出上面的情况呢?
  其实你要从 Strin 和 StrinBuffer 的属性去出发。
平时我们说的字符串,输出的都是 String,注意:String一旦被创建,它的值自始直终都不可以再变了,而StringBuffer是可以变的,但是我们要打印出来的时候也要将它转换成为 String(你可以去看看规范),(上面其实是自动转换的(print的时候)。

[其他解释]
public class StringTest3
{
public static void main(String[] args) {
        testMethod();
    }
 
    public static void testMethod() {
        String i = new String("a");
        String k = new String("b");
        StringBuffer a = new StringBuffer("AAA");
        StringBuffer b = new StringBuffer("BBB");
        setMethod(a, b);
        setMethod(i, k);
        System.out.println(a); // AAABBBCCC
        System.out.println(b);//BBBAAADDD
        System.out.println(i);//a
        System.out.println(k);//b
    }
 
    public static void setMethod(StringBuffer a, StringBuffer b) {


        a.append("BBBCCC");
        b.append("AAADDD");
    }
 
    public static void setMethod(String a, String b) {
        a = "10";
        b = "20";
System.out.println(a); //这样就能输出了,
System.out.println(b);
    }
}

在值传递的过程中,始终传的是值,在java中没有传引用这一说。
a = "10";
b = "20";
这是定义在方法体内的两个量,会给他们分配内存,可是这两个量的值,不会因为实际参数的改变而改变,因为这两个参数的作用域仅在方法体,他们可以和实际参数共享一个内存,他不会改变实际参数的地址。仅仅是指向的地址变了

[其他解释]
代码是想考你: StringBuffer和String的区别
前者内容可以改变,后者不可以改变
所谓的“引用传递” ,我理解就是 按值传递 ,只是前者内存内容可以操纵,后者不可操纵。
[其他解释]
lz,字符串是一个不可变类型,一经创建不可更改String s1 = new String("123");和String s2 = "123";仔细体会下两者的区别,相信你会有所收获。
[其他解释]
这么说吧,你记住两点就OK了:
1,对于简单类型 和 String strABC = "123";  这两种定义是值传递。
2,其余的所有对象都是引用传递。

至于 概念上就不要纠结了,没有意义。
[其他解释]
楼上的已经说的差不多了,在java中,只有值传递,其实研究太多也没有什么意思。另外,string一旦指定,其值是不变的,之所以有变的,是因为重新赋值,会让变量指向一个新的内存地址。
[其他解释]
怎么都木有人过来回复
[其他解释]

引用:
java 是按值传递的,所有的对象都是。没有引用传递一说。

这里的值是指引用地址的值。

public static void setMethod(String a, String b) {
        a = "10";
        b = "20";
    }
这里的 a= "10",是指将对象a的地址又赋给 "10"这个字符串的地址去了。……

还是有点没明白,为什么a = "10";  b = "20"; 的值没有被更新掉....
[其他解释]
该回复于2012-11-28 09:29:42被管理员删除
[其他解释]
引用:
代码是想考你: StringBuffer和String的区别
前者内容可以改变,后者不可以改变
所谓的“引用传递” ,我理解就是 按值传递 ,只是前者内存内容可以操纵,后者不可操纵。

这个好像比较容易理解

热点排行