Java 的参数是以值传递的形式传入方法中,而不是引用传递。
    以下代码中 Dog dog 的 dog 是一个指针,存储的是对象的地址。在将一个参数传入一个方法时,本质上是将对象的地址以值的方式传递到形参中。

    1. public class Dog {
    2. String name;
    3. Dog(String name) {
    4. this.name = name;
    5. }
    6. String getName() {
    7. return this.name;
    8. }
    9. void setName(String name) {
    10. this.name = name;
    11. }
    12. String getObjectAddress() {
    13. return super.toString();
    14. }
    15. }

    在方法中改变对象的字段值会改变原对象该字段值,因为引用的是同一个对象。

    1. class PassByValueExample {
    2. public static void main(String[] args) {
    3. Dog dog = new Dog("A");
    4. func(dog);
    5. System.out.println(dog.getName()); // B
    6. }
    7. private static void func(Dog dog) {
    8. dog.setName("B");
    9. }
    10. }

    但是在方法中将指针引用了其它对象,那么此时方法里和方法外的两个指针指向了不同的对象,在一个指针改变其所指向对象的内容对另一个指针所指向的对象没有影响。

    1. public class PassByValueExample {
    2. public static void main(String[] args) {
    3. Dog dog = new Dog("A");
    4. System.out.println(dog.getObjectAddress()); // Dog@4554617c
    5. func(dog);
    6. System.out.println(dog.getObjectAddress()); // Dog@4554617c
    7. System.out.println(dog.getName()); // A
    8. }
    9. private static void func(Dog dog) {
    10. System.out.println(dog.getObjectAddress()); // Dog@4554617c
    11. dog = new Dog("B");
    12. System.out.println(dog.getObjectAddress()); // Dog@74a14482
    13. System.out.println(dog.getName()); // B
    14. }
    15. }