为什么String作为参数和基本数据类型一样用的值传递?String作为类不应该和和其他类一样是传址的吗?难道就因为他是final类public class TestDemo4
{
static void t(String s)
{
s = "java";
}
public static void main(String[] args)
{
String str = "servlet";
t(str);
System.out.println(str);
}
}
{
static void t(String s)
{
s = "java";
}
public static void main(String[] args)
{
String str = "servlet";
t(str);
System.out.println(str);
}
}
String a = "no"; // 这里并没有改变 对象"ok"的值,只是让引用a指向了另外一个新的对象"no"了
String a = "no"; // 这里并没有改变 对象"ok"的值,只是让引用a指向了另外一个新的对象"no"了楼上这样写会出错的
int i = 1;
f(i);
// 这里i还是1,因为i只是把它的值的拷贝,即另一个1,给了f(),它自身的值仍然不变
}void static f(int i) {
i = 2;
}对于对象类型,同样也是传值。但是由于拷贝对象的开销很大,所以java在参数传递时不会也不允许把整个对象拷贝一份,而是把对象的内存地址拷贝一份给方法。
(C++允许拷贝整个对象,但是要处理相当烦琐的复制控制,C++中可以通过将拷贝构造函数调为私用来限制拷贝整个对象,但在Java中,拷贝对象传值这种方式被完全禁止了。)
如:
//自定义类型T
class T {
int i;
T(int i) { this.i = i; }
}
public static void main(String[] args) {
T t = new T(100);
f(t);
// 这里t还是指向new T(100),因为t只是把它地址的拷贝给了f(),t自身的指向仍然不变
}void static f(T t) {
t = new T(200); // 试图让t指向另一个对象,但其实这里的t已经不是方法外的那个t了,只是一个复制品,所以改变它的指向,对方法外的那个t丝毫没有影响
}
但是,由于f()方法中的t存储了对象的地址,所以可以通过它来直接操作它所指向的那个对象。所以,如果把f()改成:
void static f(T t) {
t.i = 200;
}
那么,执行f(t)以后,对象便得到了修改。顺便说一下,楼主所说的String是一个特殊的类型(如1楼说的)。它不仅和所有对象一样不拷贝自身而只是拷贝地址给方法,而且就是连自身也不允许改变。所以,上面通过对f()方法的那种修改不适用于String类型。