1.克隆clone
protected Object clone() 创建并返回此对象的一个副本。
为什么需要克隆对象?直接new不行吗?
克隆的对象可能包含了一些已经修改过的属性,new出来的对象属性,需要初始化.当需要一个新的对象来保存当前对象的状态,需要使用clone方法.
如果把对象的临时属性一个一个的值赋值给新new出来的对象,可以吗?可以的,不过比较麻烦.
我们常见的object obj = new Object(); Object b; b=a;这种形式的代码复制的是引用地址,及栈中的地址,a和b都指向了同一个对象.
而通过clone方法得到的对象跟原来的对象是同时存在的两个对象.
1.1.实现clone的步骤
1.1.1需要复制的类实现Clonenable接口,实现clone()方法
例如:
父类Animal
/**
* 父类
*/
public class Animal {
int a ;
static int b;
public Animal(int a) {
super();
this.a = a;
System.out.println("animal有参数的构造器");
}
{
System.out.println("animal中的代码块");
}
static {
System.out.println("adnimal中的静态代码块");
}
public static void speak() {
System.out.println("animal中的speak()静态方法");
}
public void run() {
System.out.println("animal中的run()方法");
}
public Animal() {
System.out.println("animal中的无参数构造器");
}
}
子类cat
/**
* 子类cat
* @author yh
*
*/
public class Cat extends Animal implements Cloneable {
int c ;
{
System.out.println("Cat中的代码块");
}
static {
System.out.println("Cat中的静态代码块");
}
public Cat() {
System.out.println("Cat中的无参构造器");
}
public Cat(int a, int c) {
super(a);
this.c = c;
System.out.println("cat中的有参构造器");
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
子类cat是主要克隆的类,已经实现了clonenable接口,重写了clone()方法
测试类Test
/*
* 测试类
*/
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
Cat cat = new Cat();
cat.speak();
cat.run();
Cat cats = (Cat) cat.clone();
System.out.println(cat == cats);
}
}
2.equals
public boolean equals(Object obj)
所有继承于object的类,都会有该方法,底层实现如下
public boolean equals(Object obj) {
return (this == obj);
}
在object类中,equals方法比较的是对象的引用是否相等,是否指向同一个对象.