这个问题要jvm的实现角度去考虑问题。虽然String在java中是属于类,并不是属于原始类型。但是由于在系统的处理中,字符串的处理站了90%以上,而字符串使用方便性就比较重要了。因此对于String这种对象, jvm会特殊对待。对于String对象的=操作,参数传递操作,进行传值操作。 因此你才可以进行这样的操作 String a = "aaa"; String b = a; b += "cccc";而对于其他的任何对象,你都不能使用+操作哦!我曾经看过关于这个问题的英文资料,不过基本忘记了。 但是大体意思可能就是上面所说的!
同意楼上的。 另外,在JAVA TUTORIAL里,解释这种String a = "aaaaa";是因为JAVA的编译器遇到不变的字符串时会自动创建一个匿名的STRING对象"aaaaa"。所以可以用类似基本类型的方式创建。另一方面也是因为STRING是一个广泛使用的类型,所以用这种方式。当然,String a = new String();这样的标准的类的创建方式也支持。不过这个创建的是一个空字符串,长度是0。String a = new String("aaaaa");就是楼主写的了。总之,象楼上说的"java中对基本类型按值传递,其他的按引用传递".100%没错.不要被String a = "aaaaa"这个迷惑了就好.
我也来讲两句: ================== String s = "Hello"; // 引用s ------------><[Hello]内存堆栈中> String b = s; // 引用b ------------>引用s --------->↑String s = New String("Hello"); //引用s ------------><构造[Hello]内存堆栈中> ========1,3不同之处是由于JVM内部操作规范不同至于传参方法,基本数据类型按值传送大家可能都理解,至于Object类型是按引用传递的,而为什么String是按值传递呢?答:错误,一句话,不是按值传递,而是传的是实例Object不可改变的对象引用的Copy,所以还是按引用传递!
class test { public static void main(String[] args) { String a = "100"; String b=new String("100"); String c="100"; System.out.println(a==b); System.out.println(a==c); System.out.println(c==b); } }输出结果:false true false结论:……
//这样的操作由于调用了new String即构造函数会创建一个新的对象出来String b=a; //无论是不是String对象,这样的赋值操作没有创建一个新的对象出来,只是令到b a指向同一个对象
String d = "aaaaa";
//由于JVM的优化操作,会在编译或运行的时候自动令到所有同一个类中的"aaaaa"指向同一个对象
所以会可能令到a == d
String其实本质上就是一个普通的类,仅仅是JVM会针对它作一些优化罢了
的地址赋给a;若没有则在常量池中新建一个"aaaaa"的字符串,然后将
地址赋给a.
String b=a;//->b中的地址=a的地址.b与a引用同一个字符串常量
String a=new String("aaaaa"); //新建一个"aaaaa"字符串
String b=a;;//->b中的地址=a的地址.b与a引用同一个字符串常量
jvm会特殊对待。对于String对象的=操作,参数传递操作,进行传值操作。
因此你才可以进行这样的操作
String a = "aaa";
String b = a;
b += "cccc";而对于其他的任何对象,你都不能使用+操作哦!我曾经看过关于这个问题的英文资料,不过基本忘记了。
但是大体意思可能就是上面所说的!
我看了一下String类的源码。
现在举个例子,希望队还没搞懂的朋友有个帮助:
String aString="aaa";//this.aString对象引用 指向新创建的String对象 .value=
//"aaa"
fString(aString);
public String fString(String aString)
{
aString="bbb";//aString指向新创建的String对象 .value="bbb"
}
//aString对象引用和"bbb"String对象销毁。
//this.aString还是指向"aaa";
String bString=aString;//新建bString对象引用指向aString所指向的"aaa"对象。
bString="bbb";//bString指向新建的对象"bbb";
bString="aaa";//一般的对象,应该是bString指向新建的对象"aaa"
//但是,java编译器 对String对象进行了优化,bString会指向已创建的"aaa"
//以节约内存 而且String对象在创建后就不能改变---看一下String类的源码可知
//----他没有提供public方法去改变String的实例字段,特别是无法改变this.value
//这个char[]的值。
我们假设创建了一个类StringValue,完全复制了String类的代码,并且新增了一个
public 方法
public void setValue(String aString);将String的value[]数组的值改变。 StringValue a="aaa";//新建一个StringValue对象引用this.a 指向新建的StringValue对象
//其中 对象标识符.value="aaa"
fff(a);
public void fff(StringValue a)
{
a.setValue("bbb");//a指向this.a指向的对象 .value="aaa",所以a.value=="aaa";
//改变 a.value="bbb";
a="ccc";//a指向新建的对象"ccc"
}
//对象引用a 和对象"ccc"删除
//this.a指向原来的对象, 但a.value!="aaa",a.value="bbb" 以上程序我的没有测试,请给我测试一下,如有问题,请告诉我。
String b=a;//这里并没有新建对象。只是b指向了a所指向的对象。
如果你熟悉的是C++,你要明白,java中所有变量都是类似c++中"引用"这样的东西。
照你的理解,别的类也是跟String一样的。java中对基本类型按值传递,其他的按引用传递。========================
String类的参数传递方式的问题和探讨!
Java是参数传值调用, 这个没有问题。
但是,String类的对象 居然是 与 基本数据类型一样。 这个我啊有些搞不懂!
String a="aaaaa";
String b=a;//新建了一个对象="aaaaa"; 不知道, String a=new String("aaaaa");
String b=a;
是不是结果与 上面一样啊? 我还没试过!
还有,看了 java类库的 String 源码, 看到实例字段是 char[] 型的字符数组。
万望高手指教, 告诉我String是怎样实现的,原理何在?
如果有书解释过这个问题, 请告知我书名·!
不胜感激!
另外,在JAVA TUTORIAL里,解释这种String a = "aaaaa";是因为JAVA的编译器遇到不变的字符串时会自动创建一个匿名的STRING对象"aaaaa"。所以可以用类似基本类型的方式创建。另一方面也是因为STRING是一个广泛使用的类型,所以用这种方式。当然,String a = new String();这样的标准的类的创建方式也支持。不过这个创建的是一个空字符串,长度是0。String a = new String("aaaaa");就是楼主写的了。总之,象楼上说的"java中对基本类型按值传递,其他的按引用传递".100%没错.不要被String a = "aaaaa"这个迷惑了就好.
==================
String s = "Hello"; // 引用s ------------><[Hello]内存堆栈中> String b = s; // 引用b ------------>引用s --------->↑String s = New String("Hello"); //引用s ------------><构造[Hello]内存堆栈中> ========1,3不同之处是由于JVM内部操作规范不同至于传参方法,基本数据类型按值传送大家可能都理解,至于Object类型是按引用传递的,而为什么String是按值传递呢?答:错误,一句话,不是按值传递,而是传的是实例Object不可改变的对象引用的Copy,所以还是按引用传递!
public static void main(String[] args) {
String a = "100";
String b=new String("100");
String c="100";
System.out.println(a==b);
System.out.println(a==c);
System.out.println(c==b);
}
}输出结果:false true false结论:……