一:值传递和引用传递的区别

值传递:(形参是基本类型)方法调用时,实际参数把值传递给形式参数,形式参数会新辟一个内存单元,用实参的值初始化,两者是不同的内存单元,形参再次被赋值的话,是不会影响实参的。

 

引用传递:(形参是引用类型,为对象和数组,传的是地址),方法调用时,实参是对象或数组,传递给形参的是内存地址,两者指向的是同一个内存单元,形参改变了值的话,实参也会发生改变。

 

二:为什么说在java里面只有值传递

  这句话的意思是值传递传递的是值的拷贝,引用传递传递的是引用地址,统称值传递

 

三:特殊情况的传值

先看一个特殊的例子,string是一个对象了吧,那么它是按照引用传递的喽。看下面代码的结果

public class Test{
    public static void main(String[] args){
       String str = "java";
       change(str);
        System.out.println(str);
    }
    public static void change(String str){
        str = "web";
        System.out.println(str);
    }
}

很明显,传递的string并没有改变实参的值,那么是为什么呢?下面我再举两个例子,注意区别!

 

 1 public class A {
 2     public int age;
 3 
 4     public A(int age) {
 5         this.age = age;
 6     }
 7 
 8     public int getAge() {
 9         return age;
10     }
11 
12     public void setAge(int age) {
13         this.age = age;
14     }
15 }
public class Test {
    public static void change(A a){
         a.setAge(18);
        System.out.println(a.getAge());
    }
    public static void main(String[] args) {
        A a = new A(22);
        change(a);
        System.out.println(a.getAge());

    }
}

咦,怎么这时候又可以形参改变实参了呢?别急,再看看下一个例子(A类不变)

 1 public class Test {
 2     public static void change(A a){
 3          a=new A(18);  //主要这里发生变化
 4         System.out.println(a.getAge());
 5     }
 6     public static void main(String[] args) {
 7         A a = new A(22);
 8         change(a);
 9         System.out.println(a.getAge());
10 
11     }
12 }

在change方法里面a对象指向了新的实例,也就是说形参指向的是0x8888(假设),而实参指向的还是原来的0x6666,两者引用的地址不一样了,所以并没有改变实参的引用地址,也没有改变引用地址所指向的值!

 

现在我们回到那个string,结果string的特殊性,我们不难想到,在方法里面,str=“web”,是新的对象,所以不同的引用地址,形参改变的值不会影响实参,只有两者指向地址相同才能改变。

 

posted on 2019-02-20 04:10  蓝绿绿  阅读(734)  评论(0编辑  收藏  举报