让我们来详细讲解一下Java中的对象和对象引用实例浅析。
掌握对象和对象引用的基础概念
在Java中,对象是我们需要操作的数据实体。对象本身是占用内存空间的,所以我们需要引用来间接操作对象。对象引用指的是一个指针变量,它指向一个对象在内存中的位置。Java中的对象都是存储在堆内存中,而引用则可以存储在栈内存中。
对象的创建过程
对象的创建过程分为两个步骤:声明和实例化。
- 声明对象
在Java中,声明对象通常是通过类创建对象。例如:
public class Person {
//...
}
Person person;
上述代码中,我们声明了一个Person类型的变量person,但是它还没有指向任何对象。
- 实例化对象
实例化对象是指分配内存空间来存储对象。在Java中,使用关键字new
来实例化一个对象。例如:
public class Person {
//...
}
Person person;
person = new Person();
上述代码中,我们实例化了一个Person对象,通过变量person来引用这个新建的对象。
对象引用的基本操作
对象引用的基本操作包括:对象的复制、对象引用的比较、对象的销毁。
- 对象的复制
对象的复制是指创建一个新的对象,该对象与原对象具有相同的属性和值。Java中的对象复制有两种方式:浅拷贝和深拷贝。
- 浅拷贝
浅拷贝是指创建一个新的对象,并将原对象的属性值全部复制到新对象中。但是,对于引用类型的属性,拷贝的是对象引用地址,新对象与原对象共用同一份数据。示例代码如下:
public class Person {
private String name;
private int age;
private Address address;
}
public class Address {
private String province;
private String city;
private String street;
}
Person p1 = new Person();
Address addr = new Address();
addr.setProvince("北京");
addr.setCity("北京市");
addr.setStreet("海淀区中关村街道");
p1.setName("小明");
p1.setAge(18);
p1.setAddress(addr);
Person p2 = p1; // 对象引用赋值,p1和p2指向同一个对象
p1.setName("小红"); // 修改p1的name属性
System.out.println(p2.getName()); // 输出"小红",p1和p2指向同一个对象
- 深拷贝
深拷贝是指创建一个新的对象,并将原对象的属性值全部复制到新对象中,包括引用类型的属性。深拷贝是完全独立的对象,与原对象没有任何关联。示例代码如下:
public class Person implements Cloneable {
private String name;
private int age;
private Address address;
public Person clone() throws CloneNotSupportedException {
Person newPerson = (Person) super.clone();
newPerson.address = address.clone();
return newPerson;
}
}
public class Address implements Cloneable {
private String province;
private String city;
private String street;
public Address clone() throws CloneNotSupportedException {
return (Address) super.clone();
}
}
// 测试代码
Person p1 = new Person();
Address addr = new Address();
addr.setProvince("北京");
addr.setCity("北京市");
addr.setStreet("海淀区中关村街道");
p1.setName("小明");
p1.setAge(18);
p1.setAddress(addr);
Person p2 = p1.clone(); // 深拷贝,p1和p2是完全独立的对象
p1.setName("小红"); // 修改p1的name属性
System.out.println(p2.getName()); // 输出"小明",p1和p2是完全独立的对象
- 对象引用的比较
对象引用的比较可以用==
操作符或equals()
方法来实现。
==
操作符
==
操作符比较的是两个对象的地址是否相同,即判断两个引用是否指向同一个对象。示例代码如下:
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
System.out.println(s1 == s2); // 输出"true",s1和s2指向同一个对象
System.out.println(s1 == s3); // 输出"false",s1和s3指向不同的对象
equals()
方法
equals()
方法比较的是两个对象的内容是否相同,即判断两个对象的属性值是否相同。例如:
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
System.out.println(s1.equals(s2)); // 输出"true",s1和s2的属性值相同
System.out.println(s1.equals(s3)); // 输出"true",s1和s3的属性值相同
- 对象的销毁
在Java中,对象的销毁是由垃圾收集器来完成的。当程序无法访问一个对象时,该对象就成为了垃圾数据,垃圾收集器会自动回收这些垃圾数据所占的空间。
示例代码:
Person p1 = new Person();
p1 = null; // 将p1指向的对象设为null
上述代码中,将p1赋值为null,p1指向的Person对象就无法再被访问,成为垃圾数据。当垃圾收集器运行时,它会回收这个Person对象所占用的空间。
总结
以上就是对Java中的对象和对象引用实例的浅析。我们了解到对象和对象引用的概念、对象的创建过程、对象引用的基本操作等方面的知识点。在实际应用中,需要根据具体的场景实现对象引用的复制、比较和销毁等操作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中的对象和对象引用实例浅析 - Python技术站