Administrator
发布于 2017-10-24 / 55 阅读
1

Java的参数传递方式

Java的参数传递方式分为值传递和引用(地址)传递
值传递:是将变量的一个副本传递到方法中,方法中如何操作该变量副本,都不会改变原变量的值。
引用传递:是将变量的内存地址传递给方法,方法操作变量时会找到保存在该地址的变量,对其进行操作。会对原变量造成影响。 
通过下面的例子来理解这两种方式的区别
import java.util.Arrays;

    public class Main {

    public static void main(String[] args) {
        Main main = new Main();

        String str = "123";
        System.out.println("before:"+str);
        main.changeStr(str);
        System.out.println("after:"+str);

        System.out.println("==============================");

        User user = new User("user A");
        System.out.println("before:"+user.name);
        main.changeObject(user);
        System.out.println("after:"+user.name);

        System.out.println("==============================");

        User user2 = new User("user A");
        System.out.println("before:"+user2.name);
        main.changeObjectValue(user2);
        System.out.println("after:"+user2.name);

        System.out.println("==============================");

        int a[] = {1,2,3};
        System.out.println("before:"+Arrays.toString(a));
        main.changeArrayValue(a);
        System.out.println("after:"+Arrays.toString(a));
    }

    public void changeStr(String str){
        str = "hello world";
    }

    public void changeObject(User u){
        u = new User("user B");//此处无法修改u为一个新的对象
    }

    public void changeObjectValue(User u){
        u.name = "user C";//此处可以修改u对象的值
    }

    public void changeArrayValue(int[] a){
        a[0] = 4;
        a[1] = 5;
        a[2] = 6;
    }

    static class User{
        public User(String name){
            this.name = name;
        }
        String name;
    }
}

 输出结果如下:

before:123
after:123
==============================
before:user A
after:user A
==============================
before:user A
after:user C
==============================
before:[1, 2, 3]
after:[4, 5, 6]

 

通过上面例子可以得出结论如下:
  •  一个方法不能修改一个基本数据类型的参数(即数值型、布尔型、String)。

  • 一个方法可以改变一个对象(数组)参数的状态。

  • 一个方法不能让对象参数(数组)引用一个新的对象。