//Syudent4

/*
* Object类的finalize(完成)方法和Clone方法
*
* protected void finalize()
当垃圾收集确定不再有对该对象的引用时,垃圾收集器在对象上调用该对象。(垃圾回收器)
* protected Object clone()
创建并返回此对象的副本。(克隆)
* cloneable:
* public interface Cloneable一个类实现Cloneable接口,
* 以指示Object.clone()方法,
* 该方法对于该类的实例进行现场复制是合法的。
* 在不实现Cloneable接口的实例上调用对象的克隆方法导致抛出异常CloneNotSupportedException 。
按照惯例,实现此接口的类应使用公共方法覆盖Object.clone (受保护)。

* */
public class Student4 extends Object implements Cloneable{//实现标记接口,没有抽象方法(是一个标记接口
private String name;
private int age;

public Student4() {
super();
}

public Student4(String name, int age) {
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}
//clone源码
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}

}

//测试类
//克隆只是对象的引用指向同一个对象,并不是地址也一样,一个地址只能存放一个对象
public class Student4_Test {


public static void main(String[] args) throws CloneNotSupportedException{
//对象的克隆
Student4 s1 = new Student4("周杰伦",18);
Student4 s2 = s1;
//s1和s2算两个对象吗?不算,只算两个引用,她两的内存地址指向的都是同一个,不算克隆
//如何克隆对象?
//Object clone = s1.clone();报错,因为一个对象是否能克隆,要看该对象是否实现了一个标记接口(cloneable)
//如果一个接口内部是空的,那么咱们叫这个接口是’标记接口‘,作用是打标记
Object clone = s1.clone();//异常:CloneNotSupportedException,需要抛出异常
Student4 s3 = (Student4)clone;//向下转型,s3是是克隆得到的,
//s1和s3是同一个对象吗? 是
System.out.println(s1);//直接打印和调用toString方法是一样的,结果:Student4{name='周杰伦', age=18}
System.out.println(s3);//打印 结果:Student4{name='周杰伦', age=18}
//s1和s3内存地址一样吗?一个地址只能放一个对象
System.out.println(s1==s3);//FALSE

}
}