马士兵java架构师

您现在的位置是:架构师问答 >

架构师问答

java中对象的复制与引用

2023-11-24 16:16:22架构师问答 本文浏览次数:1 百度已收录

本 文 目 录

java中对象的复制与引用

在Java中,我们经常需要对对象进行复制和引用的操作。复制是创建一个新对象,该对象具有原始对象的所有属性值。而引用则是将一个变量指向另一个对象。

1. 对象的浅复制、深复制与引用

复制对象的主要作用是在不改变原有对象的基础上,创建一个新的具有相同属性的对象。我们可以使用浅复制深复制来实现这个目标。

浅复制只复制对象的引用,而不复制其包含的对象,因此两个对象共享相同的引用。而深复制则复制了所有嵌套的对象,使得两个对象完全独立。

引用对象的主要作用是让多个变量指向同一个对象,这样可以方便地共享和操作数据。在Java中,我们只需要将一个对象赋值给另一个变量即可实现引用。

2. 实现浅复制

class Student {
    String name;
    int age;

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

public class Main {
    public static void main(String[] args) {
        Student student = new Student("Tom", 20);
        Student studentCopy = new Student(student.name, student.age);

        System.out.println(student); // 输出: Student{name='Tom', age=20}
        System.out.println(studentCopy); // 输出: Student{name='Tom', age=20}
    }
}

在这个例子中,我们创建了一个名为Student的类,它有两个属性:nameage。然后我们创建了一个Student对象student,并通过传递studentnameage参数创建了一个新的Student对象studentCopy。这就是所谓的浅复制,因为只有基本类型的属性被复制,如果Student类还有其他对象作为属性,那么它们的引用将会被复制,而不是对象本身。

3. 实现深复制

import java.util.Arrays;

class Student {
    String name;
    int age;
    int[] scores;

    public Student(String name, int age, int[] scores) {
        this.name = name;
        this.age = age;
        this.scores = scores.clone();
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", scores=" + Arrays.toString(scores) +
                '}';
    }
}

public class Main {
    public static void main(String[] args) {
        int[] scores = {89, 95, 76};
        Student student = new Student("Tom", 20, scores);
        Student studentCopy = new Student(student.name, student.age, student.scores);

        System.out.println(student); // 输出: Student{name='Tom', age=20, scores=[89, 95, 76]}
        System.out.println(studentCopy); // 输出: Student{name='Tom', age=20, scores=[89, 95, 76]}

        scores[0] = 90;
        System.out.println(student); // 输出: Student{name='Tom', age=20, scores=[90, 95, 76]}
        System.out.println(studentCopy); // 输出: Student{name='Tom', age=20, scores=[89, 95, 76]}
    }
}

在这个例子中,我们在Student类中增加了一个数组scores,并且在构造函数中调用了clone()方法来复制这个数组。这样一来,即使我们修改了原对象的scores数组,复制的对象的scores数组也不会受到影响。这就是深复制。

4. 引用对象

public class Main {
    public static void main(String[] args) {
        Student student = new Student("Tom", 20);
        Student anotherStudent = student;

        System.out.println(student); // 输出: Student{name='Tom', age=20}
        System.out.println(anotherStudent); // 输出: Student{name='Tom', age=20}

        student.age = 21;
        System.out.println(student); // 输出: Student{name='Tom', age=21}
        System.out.println(anotherStudent); // 输出: Student{name='Tom', age=21}
    }
}

在这个例子中,我们将student对象赋值给了anotherStudent变量,这意味着他们现在都指向同一个对象。当我们修改student对象的age属性时,anotherStudent对象的age属性也会相应地改变。这就是引用对象。

5. 总结与注意事项

  • 浅复制只是复制了基本类型的属性,对于对象类型,只会复制其引用。
  • 深复制会复制所有的属性,包括对象类型属性。
  • 引用对象可以让多个变量指向同一个对象,修改其中一个变量会影响其他的变量。

6. 完整代码示例

class Student {
    String name;
    int age;
    int[] scores;

    public Student(String name, int age, int[] scores) {
        this.name = name;
        this.age = age;
        this.scores = scores.clone();
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", scores=" + Arrays.toString(scores) +
                '}';
    }
}

public class Main {
    public static void main(String[] args) {
        int[] scores = {89, 95, 76};
        Student student = new Student("Tom", 20, scores);
        Student studentCopy = new Student(student.name, student.age, student.scores);

        System.out.println(student); 
        System.out.println(studentCopy);

        scores[0] = 90;
        System.out.println(student);
        System.out.println(studentCopy);

        Student anotherStudent = student;
        System.out.println(student);
        System.out.println(anotherStudent);

        student.age = 21;
        System.out.println(student);
        System.out.println(anotherStudent);
    }
}