javase -- 值传递和引用传递


实际上,java方法参数传递只有值传递,只不过我们所说的引用传递 传递的是 对象的引用(地址值)

这个博客很详细

值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

引用传递(pass by reference)是指在调用函数时将实际参数地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

值传递 引用传递
根本区别 拷贝值 拷贝对象(对象引用改变,但指向的是同一对象)
所以 方法中无法改变原来的对象 方法中可以改变原来的对象(对象的属性…)

对象的属性(普通成员变量):不包含静态成员变量(这个是属于类的),不包含常量(final修饰,因为不是变量,不可改变)

值传递(参数是基本类型)

public static void main(String[] args) {
    int a = 1, b = 2; 
    System.out.println(a+" "+b);
    swap(a,b);
    System.out.println(a+" "+b);
}
// 参数是基本类型 
public static void swap(int a, int b) {
    int tmp = 0;
    tmp = a;
    a = b;
    b = tmp;
}

/*
    1 2
    1 2
*/

引用传递(参数是引用类型):类、数组

  • 引用类型 两值交换 也只能是 内部元素或变量进行交换,不是对象进行交换(这个是错误的,相当于赋值操作)
public class Arg {
    public static void main(String[] args) {
        Data data = new Arg().new Data();
        data.a = 1;
        data.b = 2;
           System.out.println(data.a+" "+data.b);
           swap(data);
           System.out.println(data.a+" "+data.b);
    }
    // 参数是引用类型
    public static void swap(Data data) {
          int tmp = 0;
          tmp = data.a;
          data.a = data.b;
          data.b = tmp;
    }

    class Data{
        int a,b;
    }
}

/*
    1 2
    2 1
*/
public static void main(String[] args) {
    String[] strs = new String[2];
    strs[0] = "1";
    strs[1] = "2";
    System.out.println(strs[0]+" "+strs[1]);
    swap(strs);
    System.out.println(strs[0]+" "+strs[1]);
}

public static void swap(String[] str) {
    String tmp = "";
    tmp = str[0];
    str[0] = str[1];
    str[1] = tmp;
}

/*
    1 2
    2 1
*/

两值交换 引用传递错误示例

错误示例1

public static void main(String[] args) {
    String a = "1";
    String b = "2";
    System.out.println(a+" "+b);
    swap(a,b);
    System.out.println(a+" "+b);
}

public static void swap(String a, String b) {
    String tmp = "";
    tmp = a;
    a = b;
    b = tmp;
}

/*
    1 2
    1 2
*/

错误示例2 传入的是String类型 引用类型,但仍然不是内部元素或属性的值交换

public static void main(String[] args) {
    String[] strs = new String[2];
    strs[0] = "1";
    strs[1] = "2";
    System.out.println(strs[0]+" "+strs[1]);
    swap(strs[0],strs[1]);
    System.out.println(strs[0]+" "+strs[1]);
}

public static void swap(String a, String b) {
    String tmp = "";
    tmp = a;
    a = b;
    b = tmp;
}

/*
    1 2
    1 2
*/

文章作者: liuminkai
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 liuminkai !
评论
 上一篇
javase -- 继承性的体现 javase -- 继承性的体现
继承性.class subclass extends superclass{} subclass: 子类、派生类 superclass:父类、基类、超类 继承性的好处. 减少代码的冗余,提高了代码的复用性 便于功能的扩展 为之后多态性的
2020-07-28
下一篇 
javase -- 可变形参 javase -- 可变形参
可变形参(varargs).JDK1.5 编译器认为:String[] arr == String ... arr String[] 做形参只能传入 数组 String...做形参可以传入数组,无参,有个数变化的参数,但是只能有
2020-07-28
  目录