不可变类是指当创建了这个类的实例后,就不允许修改它的值的类,也就是一个对象一旦被创建出来,在其整个生命周期中,它的成员变量就不能被修改了,只允许其他程序进行读操作,而不允许其他程序进行修改操作。
在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); } }
输出结果:
由输出结果可以看出,对象的地址为同一个,所以指向的是同一个对象;
而值传递,改变的只是形参副本。