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()方法,自己写克隆代码。
简单地讲,一个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; } }运行程序,结果如下:
相关文章推荐
- java克隆对象clone()的使用方法和作用
- java中equals和==之间的区别?clone方法的作用,及其为什么要使用clone方法?如何使用clone复制对象?以及深克隆浅克隆
- java使用serializable进行序列化与反序列化实现对象clone(克隆)
- JAVA基础学习之流的简述及演示案例、用缓冲区方法buffer读写文件、File类对象的使用、Serializable标记接口(6)
- 五星-原型模式常使用于以下场景--而JAVA中的任何类只要实现了Cloneable标识接口,就可以使用clone方法来进行对象的拷贝
- java 深克隆clone对象或容器的另一种方法
- JAVA克隆详解以及clone方法使用
- Java 基础数据类型 和 深度克隆对象的2种方法(实现Cloneable接口或者实现对象序列化)
- java clone方法使用详解
- java Clone方法的使用
- Java clone方法使用详解
- java 对象 克隆 clone
- jquery之设置元素内容(克隆元素,使用clone()方法)
- java clone方法使用详解
- Object.clone()方法引申出的浅克隆、深克隆、java原型模式的实现、不可变类的实现
- java clone方法使用详解
- java Clone使用方法详解
- java反射调用配置文件构造类对象,使用其方法
- java知识点总结(==和equals,对象克隆clone等)
- java 使用class进行对象实例化的三个方法