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"
}
}
在上述代码中,我们首先创建了一个名为person1
的Person
对象,并将其名称设置为"Alice"。然后,我们将person1
赋值给person2
,这样person2
也指向了同一个对象。接下来,我们通过person2
修改了对象的名称为"Bob"。最后,输出person1
和person2
的名称,发现它们都变为了"Bob"。这是因为person1
和person2
指向同一个对象,对对象的修改会影响到所有引用。
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"
}
}
在上述代码中,我们首先创建了一个名为person1
的Person
对象,并将其名称设置为"Alice"。然后,我们通过person1
获取名称,并将其作为参数创建了一个新的Person
对象person2
。接下来,我们通过person2
修改了对象的名称为"Bob"。最后,输出person1
和person2
的名称,发现它们分别是"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"
}
}
``