一文带你认识Java中的Object类和深浅拷贝
1. Object类
在Java中,所有的类都是从java.lang.Object
类继承而来的。因此,java.lang.Object
是Java中的祖先类,拥有以下常用的方法:
equals(Object obj)
: 判断当前对象是否与参数obj
相等,可以重写该方法来实现对象的比较hashCode()
: 返回对象的hash值toString()
: 返回一个字符串,该字符串包含当前对象的类名、hash值等信息getClass()
: 返回当前对象的类的Class对象clone()
: 克隆当前对象,可以实现浅拷贝
示例1: java.lang.Object
的使用
public class Person {
private String name;
private int age;
private boolean gender;
// 省略构造器、getter、setter等方法
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return age == person.age && gender == person.gender && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age, gender);
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", gender=" + gender +
'}';
}
}
public class Main {
public static void main(String[] args) {
Person p1=new Person("Tom",18,true);
Person p2=new Person("Tom",18,true);
System.out.println(p1.equals(p2)); // true
System.out.println(p1.hashCode()); // -439625624
System.out.println(p1.toString()); // Person{name='Tom', age=18, gender=true}
System.out.println(p1.getClass()); // class Person
System.out.println(p1.clone()); // Person{name='Tom', age=18, gender=true}
}
}
2. 浅拷贝与深拷贝
在Java中,对象拷贝分为浅拷贝和深拷贝。
浅拷贝:将一个对象的引用赋值给另一个对象,而这两个对象选在内部的引用都指向同一个对象。当我们修改其中一个对象中的内部数据时,另一个对象中对应的内部数据也会发生改变。
深拷贝:在堆内存中开辟一个新的空间,将原对象的所有属性都复制到新的空间中,从而实现两个对象之间互不干扰。
示例2: 深拷贝和浅拷贝的比较
public class Address {
private String detail;
public Address(String detail) {
this.detail = detail;
}
// 省略getter、setter等方法
}
public class User implements Cloneable {
private String name;
private Address address;
// 省略构造器、getter、setter等方法
@Override
public User clone() throws CloneNotSupportedException {
User user = (User) super.clone();
user.setAddress(new Address(this.getAddress().getDetail()));
return user;
}
}
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
User u1 = new User("Tom", new Address("广东省"));
User u2 = u1.clone();
u2.getAddress().setDetail("湖南省");
System.out.println(u1.getAddress().getDetail()); // 广东省
System.out.println(u2.getAddress().getDetail()); // 湖南省
}
}
在上面的示例中,我们创建了一个User类和Address类,它们的关系是User包含一个Address的引用。我们编写了一个clone方法,手动实现了User类的深拷贝。在运行程序时,我们创建了一个用户u1,将它的克隆对象u2指向u1,然后修改了u2的地址,但是并没有影响到u1。
总结
在Java中,Object类是所有类的父类,提供了一些实用的方法。深拷贝和浅拷贝是解决对象拷贝时可能出现的问题的两种方式。深拷贝和浅拷贝分别用于处理对象内部属性是值类型或者引用类型的情况下的对象拷贝问题。深拷贝需要手动实现,使用clone来返回拷贝出来的对象,一般使用BeanUtils等工具类可以替代手动实现深拷贝,而浅拷贝则是直接将对象的引用复制给新对象。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文带你认识Java中的Object类和深浅拷贝 - Python技术站