您的位置:首页 > 编程语言 > Java开发

Java案例:使用clone()方法克隆对象

2018-02-18 20:26 597 查看
1、Object类的clone()方法注意:Object类的clone()是一个native方法。


简单地讲,一个native方法就是一个java调用非Java代码的接口。一个native方法是这样一个Java的方法:该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数。如果一个含有本地方法的类被继承,子类会继承这个本地方法并且可以用Java语言重写这个方法,同样的,如果一个本地方法被final标识,它被继承后不能被重写。标识符native可以与所有其它Java标识符连用,但是abstract除外。这是合理的,因为native暗示这些方法是有实现体的,只不过这些实现体是非Java的,但是abstract却指明这些方法是无实现体的。
2、使用clone()方法来克隆对象一个类必须实现Cloneable接口并重写clone()方法,其实例才能调用clone()方法,否则会抛出“CloneNotSupportedException”异常。

package net.hw.basic;

/**
* Created by howard on 2018/1/25.
*/
public class Demo001 {
public static void main(String[] args) throws Exception {
Person p1 = new Person();
p1.setName("howard");
p1.setAge(20);
Person p2 = (Person) p1.clone();
System.out.println("p1 = " + p1);
System.out.println("p2 = " + p2);
System.out.println("p1 == p2 " + (p1 == p2));
System.out.println("p1.getClass() == p2.getClass() " + (p1.getClass() == p2.getClass()));

}
}

class Person implements Cloneable {
private String name;
private int 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;
}

@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}

@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}运行程序,结果如下:


由此可见,克隆的对象与原对象,虽然字段内容都是相同的,但是两者并不相等,另外,它们的类对象却是相等的。




Person子类重写Object的clone()方法,里面的super并不是Object类而是其子类Person。这一点是比较怪异的。


子类重写clone()方法,直接调用super.clone()方法成为浅克隆,也可以不调用super.clone()方法,自己写克隆代码。


package net.hw.basic;

/**
* Created by howard on 2018/1/25.
*/
public class Demo003 {
public static void main(String[] args) throws Exception {
Student s1 = new Student();
s1.setName("mike");
s1.setAge(18);
Student s2 = (Student) s1.clone();
System.out.println("s1 = " + s1);
System.out.println("s2 = " + s2);
System.out.println("s1 == s2 " + (s1 == s2));
System.out.println("s1.getClass() == s2.getClass() " + (s1.getClass() == s2.getClass()));
}
}

class Student implements Cloneable {
private String name;
private int 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;
}

@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}

@Override
protected Object clone() throws CloneNotSupportedException {
Student student = new Student();
student.setName(name);
student.setAge(age);
return student;
}
}
运行程序,结果如下:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: