值传递与引用传递一张图就能理解

  不可变类是指当创建了这个类的实例后,就不允许修改它的值的类,也就是一个对象一旦被创建出来,在其整个生命周期中,它的成员变量就不能被修改了,只允许其他程序进行读操作,而不允许其他程序进行修改操作。

  在java类库中,所有基本类型的包装类都是不可变类,如Integer、Float等。此外,String也是不可变类。

  在java中,除了8种原始数据类型外,其他的类型都是对象,在方法调用的时候,传递的都是引用。从本质上讲,引用也是按值传递,只不过传递的这个值是对象的引用而已,因此,在方法调用的时候,对形参引用所指对象属性值的修改对实参可见。但是,对引用值本身的修改对实参是不可见的。

举个简单引用传递的例子:

public class Person {

    private int age;
    private String name;

    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public static void main(String args[]) {
        int n = 0;
        Person person = new Person(28, "zhansan");
        System.out.println("person1:" + person);
        person.Uname(person);
        person.Pname(person);
        person.cname(n);
        System.out.println("main:" + n);
    }

    public void Uname(Person person) {
        person.age = 8;
        person.name = "L";
        System.out.println("person2:" + person);
    }

    public void Pname(Person person) {
        person.age = 7;
        System.out.println("person3:" + person);
    }

    public void cname(int n) {
        n = n + 2;
        System.out.println("cname:" + n);
    }
}

输出结果:

由输出结果可以看出,对象的地址为同一个,所以指向的是同一个对象;

而值传递,改变的只是形参副本。

原文地址:https://www.cnblogs.com/windy-xmwh/p/9205724.html