Java复制引用与类类型

在Java中,变量分为基本类型和引用类型。基本类型是存储在栈内存中的实际数据,而引用类型则是存储在堆内存中的对象的地址。当我们复制一个基本类型的变量时,实际上是复制了其值;而当我们复制一个引用类型的变量时,实际上是复制了其引用,即指向对象的地址。这意味着两个引用变量将指向同一个对象,因此对一个引用的修改会影响到另一个引用。

一、引用类型变量的复制

在Java中,引用类型的变量复制分为浅复制和深复制两种。浅复制只复制对象的引用,而深复制则会复制整个对象。

1. 浅复制

浅复制是指复制一个对象的引用,而不是复制对象本身。这样,两个引用变量将指向同一个对象。

以下是一个浅复制的示例代码:

public class Person {
    private String name;
  
    public Person(String name) {
        this.name = name;
    }
  
    public String getName() {
        return name;
    }
  
    public void setName(String name) {
        this.name = name;
    }
}

public class Main {
    public static void main(String[] args) {
        Person person1 = new Person("Alice");
        Person person2 = person1;
  
        person2.setName("Bob");
  
        System.out.println(person1.getName()); // 输出 "Bob"
        System.out.println(person2.getName()); // 输出 "Bob"
    }
}

在上述代码中,我们首先创建了一个名为person1Person对象,并将其名称设置为"Alice"。然后,我们将person1赋值给person2,这样person2也指向了同一个对象。接下来,我们通过person2修改了对象的名称为"Bob"。最后,输出person1person2的名称,发现它们都变为了"Bob"。这是因为person1person2指向同一个对象,对对象的修改会影响到所有引用。

2. 深复制

深复制是指复制整个对象,包括对象中的所有引用类型字段,而不仅仅是复制引用。这样,新创建的对象和原对象是完全独立的。

以下是一个深复制的示例代码:

public class Person {
    private String name;
  
    public Person(String name) {
        this.name = name;
    }
  
    public String getName() {
        return name;
    }
  
    public void setName(String name) {
        this.name = name;
    }
}

public class Main {
    public static void main(String[] args) {
        Person person1 = new Person("Alice");
        Person person2 = new Person(person1.getName());
  
        person2.setName("Bob");
  
        System.out.println(person1.getName()); // 输出 "Alice"
        System.out.println(person2.getName()); // 输出 "Bob"
    }
}

在上述代码中,我们首先创建了一个名为person1Person对象,并将其名称设置为"Alice"。然后,我们通过person1获取名称,并将其作为参数创建了一个新的Person对象person2。接下来,我们通过person2修改了对象的名称为"Bob"。最后,输出person1person2的名称,发现它们分别是"Alice"和"Bob"。这是因为person2是通过复制person1的名称创建的,它们是独立的对象。

二、类类型的引用

在Java中,类类型的引用是指变量声明时使用的类类型名称,而不是对象本身。类类型的引用在编译时用于类型检查,而在运行时用于访问对象的成员。

以下是一个类类型引用的示例代码:

public class Person {
    private String name;
  
    public Person(String name) {
        this.name = name;
    }
  
    public String getName() {
        return name;
    }
  
    public void setName(String name) {
        this.name = name;
    }
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person("Alice");
  
        System.out.println(person.getName()); // 输出 "Alice"
    }
}
``