为什么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);
}
}

解决方案 »

  1.   

    String是不可变的对象,仔细看看书吧,这个是比较重要的概念。String a = "ok";
    String a = "no"; // 这里并没有改变 对象"ok"的值,只是让引用a指向了另外一个新的对象"no"了
      

  2.   

    String a = "ok";
    String a = "no"; // 这里并没有改变 对象"ok"的值,只是让引用a指向了另外一个新的对象"no"了楼上这样写会出错的 
      

  3.   

    java里面只有值传递。这也是许多软件公司笔试的时候会出现的问题。
      

  4.   

    4楼说对了。1楼的说法虽然正确,但却有点答偏了。这题和String没有关系,而是Java值传递特性决定的。参数传递只有两种方式:传值和传引用。传地址只是传值的一个特例,传的也是地址的值。Java没有引用传递这种机制,C也没有,C++才有。(顺便说一下:Java的官方在选择术语上犯上个不可饶恕的错误:就是把Java中用来存储对象地址的变量称作“引用”,Java中的“引用”并不是引用,而是存储了对象地址的变量,基本可以和C/C++中的指针变量等同。)对于简单类型,不用说,直接把值拷贝一份给方法的参数。如:public static void main(String[] args) {
      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类型。