1.基本数据类型的值传递

基本数据类型(如 int、float、boolean 等)是存储在栈内存中的,当将它们作为参数传递给方法时,实际传递的是它们的值。例如:

iOS原始数据粘包 传输原始数据用啥_参数传递

public static void swap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
}
public static void main(String[] args) {
    int x = 10;
    int y = 20;
    swap(x, y);
    System.out.println("x = " + x + ", y = " + y);
}

iOS原始数据粘包 传输原始数据用啥_参数传递

这段代码中,swap 方法并没有改变 x 和 y 的值,因为它们作为参数传递给 swap 方法时,实际上传递的是它们的值,而不是它们的引用。

2. 对象类型的值传递

对象类型(如 String、数组、自定义类等)是存储在堆内存中的,当将它们作为参数传递给方法时,实际传递的是它们的引用。

2.1简单String示例

iOS原始数据粘包 传输原始数据用啥_参数传递

public static void changeStr(String str) {
    str = "world";
}
public static void main(String[] args) {
    String s = "hello";
    changeStr(s);
    System.out.println(s);
}

iOS原始数据粘包 传输原始数据用啥_参数传递

这段代码中,changeStr 方法并没有改变 s 的值,因为它们作为参数传递给 changeStr 方法时,实际上传递的是 s 的引用,changeStr 方法中的 str 只是一个新的引用,它并不影响 s 的值。

2.2自定义类示例

假设现在有一个自定义的类 Person,包含了两个属性:姓名和年龄。现在需要编写一个方法,将传入的 Person 对象的年龄加 1,但不改变原始对象的引用。示例代码如下所示:

iOS原始数据粘包 传输原始数据用啥_参数传递

public class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
public class Example {
    public static void incrementAge(Person p) {
        p.setAge(p.getAge() + 1);
    }
    public static void main(String[] args) {
        Person p = new Person("张三", 20);
        incrementAge(p);
        System.out.println("张三的年龄为:" + p.getAge());
    }
}

iOS原始数据粘包 传输原始数据用啥_参数传递

在这个例子中,我们定义了一个 Person 类和一个 incrementAge 方法。incrementAge 方法接受一个 Person 对象作为参数,并将该对象的年龄加 1。由于传递的是对象的引用,所以方法内部的改变会反映到原始对象上,但对象的引用本身并没有改变。在 main 方法中,我们创建了一个 Person 对象,并将其传递给 incrementAge 方法。最后,我们输出了 Person 对象的年龄,发现它已经加了 1。

2.3总结

在 Java 中,所有的参数传递都是值传递。这意味着,当一个对象作为参数传递给一个方法时,实际上传递的是该对象的引用(即内存地址),而不是对象本身。因此,当方法内部修改了对象的属性时,这些改变会反映到原始对象上,因为它们引用的是同一个对象。但是,方法内部不能改变对象的引用本身,因为这是一个局部变量,只存在于方法的作用域内。如果方法需要改变对象的引用,则需要返回一个新的对象,并将其引用赋值给原始对象。因此,虽然在表现上看起来像是引用传递,但实际上 Java 中的参数传递都是值传递。