架构师问答
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
的类,它有两个属性:name
和age
。然后我们创建了一个Student
对象student
,并通过传递student
的name
和age
参数创建了一个新的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);
}
}
- 上一篇
java 数组是值传递还是引用传递
在Java中,对于基本类型的数组,它们是值传递的。而对于对象类型的数组,它们则是引用传递的。这可能会引起一些混淆,因此让我们详细地了解一下。## 一、值传递和引用传递的区别首先,我们需要了解值传递和引用传递的基本概念。**值传递**是指将变量的副本传递给函数,函数对这个副本进行操作不会影响到原变量。而**引用传递**则是将变量的地址传递给函数,函数通过这个地址可以直接修改原变量。对于Java中的基
- 下一篇
java中找不到main方法怎么办
在Java编程中,我们常常会遇到“找不到main方法”的错误提示。这是因为Java程序的执行入口是main方法,如果编译器无法找到main方法,程序就无法正常运行。那么,如何解决这个问题呢?本文将为你详细解答。## 1、解决mian方法找不到的思路1. 确认main方法是否正确编写2. 检查类名是否与文件名一致3. 使用正确的包名引用主类4. 检查编译和运行命令是否正确## 2、详细的解决步骤详解