当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 
是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。上面这句话对吗?

解决方案 »

  1.   

    其实,弄清楚这个问题得从概念入手。什么是按值传递,什么是按照参数传递。 定义一个变量TestObject obj = new TestObject(); 然后把 obj 作为参数传递给一个方法。如果在这个方法中,只能改变obj指向的这个对象的内容,那就是“值传递”,传过去的值就是指向这个对象的指针。如果在这个方法中通过操作,使得返回后的obj指向另外一个对象,那就是“引用传递”,传过去的是对这个指针变量的“引用”。 Java代码 
    public class Para1 {   
        public static void main(String[] args) {   
        StringBuffer sb = new StringBuffer("Hello ");   
        System.out.println("Before change, sb = " + sb);   
        changeData(sb);   
        System.out.println("After changeData(n), sb = " + sb);   
        }   
      
        public static void changeData(StringBuffer strBuf) {   
        //strBuf = new StringBuffer("Hi ");   
        strBuf.append("World!");   
        }   
    }  public class Para1 {
        public static void main(String[] args) {
    StringBuffer sb = new StringBuffer("Hello ");
    System.out.println("Before change, sb = " + sb);
    changeData(sb);
    System.out.println("After changeData(n), sb = " + sb);
        }    public static void changeData(StringBuffer strBuf) {
    //strBuf = new StringBuffer("Hi ");
    strBuf.append("World!");
        }
    }把strBuf = new StringBuffer("Hi ");行注释掉和不注释掉将看到两个不同的结果注释的时候: 
    Before change, sb = Hello 
    After changeData(n), sb = Hello World! 
    不注释掉的时候: 
    Before change, sb = Hello 
    After changeData(n), sb = Hello 
    当不注释掉的时候并没有出现: 
    Before change, sb = Hello 
    After changeData(n), sb = Hi World! 这说明了,在strBuf = new StringBuffer("Hi ");这行中,strBuf在内存中开辟了一个新的存储地址,不再和开始的sb指向同一个位置,所以,print出来的sb的值没有改变。这个时候的strBuf为"Hi World!"(可以在changeDate方法里面print出来),sb为"Hello"。 所以,根据上面的概念,Java传递参数是属于按值传递,这种情况下参数的值就是对该对象的引用。