// ipconfig | findstr "IPv4" // soapui cracker: <[http://download.csdn.net/download/tonyluo23/8014727]> // json 对象与数组: <[http://www.cnblogs.com/zhangji/archive/2011/09/02/2163811.html]> <[https://msdn.microsoft.com/zh-cn/library/ie/cc836459(v=vs.94).aspx]> <[https://msdn.microsoft.com/zh-cn/library/ie/cc836466(v=vs.94).aspx]> <[https://msdn.microsoft.com/zh-cn/library/ie/htbw4ywd(v=vs.94).aspx]> <[http://blog.csdn.net/column/details/step-to-oracle.html]> package com.qingyuan.server; import java.io.Serializable; public class Car implements Serializable { /** serialVersionUID */ private static final long serialVersionUID = 4539772529921666906L; private String brand; private int price; public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public Object clone() { Car car = null; try { car = (Car) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return car; } } package com.qingyuan.server; public class Person implements Cloneable { private String name; private Car car; public String getName() { return name; } public void setName(String name) { this.name = name; } public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } public Object clone() { Person person = null; try { person = (Person) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return person; } } package com.qingyuan.server; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; /** * <[java 浅拷贝与深层次拷贝 -> 深拷贝:最大程度与原对象脱离关系]> * Java中的拷贝方式分为深拷贝和浅拷贝。简单来说,深拷贝就是把一个对象中的所有值,如果被拷贝对象中有对其他对象的引用, * 那么这个引用指向的对象本身会被重新创建。浅拷贝和深拷贝类似,但是如果被拷贝对象中有对其他对象的引用,只是这个引用会 * 被拷贝,而不是这个被引用的对象 * * http://kuangbaoxu.iteye.com/blog/193222 * http://stackoverflow.com/questions/2589741/how-to-effectively-copy-an-array-in-java * http://stackoverflow.com/questions/18638743/is-it-better-to-use-system-arraycopy-than-a-fast-for-loop-for-copying-array * * public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) * Object[] foo = new Object[]{...}; * String[] bar = new String[foo.length]; * System.arraycopy(foo, 0, bar, 0, bar.length); * * "引用类型的变量"称为指针 [指针变量和该指针变量指向的对象] * 假设在函数中写了如下这个简单的语句: StringBuffer str = new StringBuffer("newString"); * 1) : new StringBuffer("newString") 在堆里申请了一块内存,把创建好的StringBuffer 对象放入; * 2) : String str 声明了一个指针,这个指针本事存储在栈上的[因为语句写在函数中],可以用来指向某个StringBuffer 类型的对象,或者换句话说,这个指针可以用来保存某个 * StringBuffer 对象的地址; * 3) : StringBuffer str = new StringBuffer("newString"); 把刚才申请的那一块内存地址保存为str 的值; * StringBuffer str2 = str * 实际上就是把str的地址复制给str2,是地址的复制,StringBuffer对象本身并没有复制。所以两个指针指向的是同一个 * * 实际上两个指针的值相同,则肯定是指向同一个对象(所以对象内容必定相同)。但是两个内容相同的对象, * 它们的地址可能不一样(比如克隆出来的多个对象之间,地址就不同) * * final常量的问题: * 针对引用类型变量的final修饰符也是很多人搞混淆的地方。实际上final只是修饰指针的值(也就是限定指针保存的地址不能变) * 至于该指针指向的对象,内容是否能变,那就管不着了,所以,对于如下语句: * final StringBuffer strConst = new StringBuffer(); * 你可以修改它指向的对象的内容,比如:strConst.append(""); * 但是不能修改它的值,比如: strConst = null; */ /** * reference: <[http://www.bdqn.cn/news/201306/9459.shtml]> */ public class SystemCopy { /* * 重点在Person person2 = person1;这一句上,person1里面包括了一个对Car对象的引用, * 那么这句话是深拷贝还是浅拷贝呢?答案是什么都不是。它只是一个简单的引用传递,执行完这句话以后, * person1和person2都指向了同一个person对象,所以无论谁去改变对象,另一个引用再去调用该对象 * 的值都会发生改变 */ /* public static void main(String[] args) { Car car1 = new Car(); car1.setBrand("BMW"); car1.setPrice(10000); Person person1 = new Person(); person1.setCar(car1); person1.setName("person1"); Person person2 = person1; person2.setName("person2"); System.out.println(person1.getName()); // person2 System.out.println(person2.getName()); // person2 Car car2 = new Car(); car2.setBrand("Benz"); car2.setPrice(20000); person1.setCar(car2); System.out.println(person2.getCar().getBrand()); // Benz System.out.println(person2.getCar().getPrice()); // 20000 }*/ /** * Car类不变,Person实现了Cloneable接口,然后重载了父类的clone方法,并且直接调用super.clone() * 方法来拷贝。但是值得注意的是,父类的clone只是浅拷贝,所以才会有上述的输出结果。那么,要想达到深拷 * 贝,需要做些什么呢? 其实答案已经很明显了,因为clone是浅拷贝,而Car中都是原始类型的变量,所以我们 * 只需要让Car类也实现Cloneable接口,然后重载clone方法,然后回到Person类中,在clone的时候,加上 * car = car.clone()就行了 * @throws IOException * @throws ClassNotFoundException */ /* public static void main(String[] args) { Car car1 = new Car(); car1.setBrand("BMW"); car1.setPrice(10000); Person originalPerson = new Person(); originalPerson.setCar(car1); originalPerson.setName("originalPerson"); Person clonePerson = (Person)originalPerson.clone(); originalPerson.setName("originalPerson_1"); originalPerson.getCar().setBrand("Benz"); System.out.println(originalPerson.getName()); System.out.println(originalPerson.getCar().getBrand()); System.out.println(clonePerson.getName()); System.out.println(clonePerson.getCar().getBrand()); }*/ /** * 让Car 类实现Serializable 接口使其能够序列化, 其次就可以使用java的 Io来传输对象了,序列化能够达到深拷贝目的 * 的原因是,它首先将整个对象进行持久化,然后全部读出, 每读出一次就得到一个全新的拷贝, 序列化较cloneable 效率低, * 究竟什么时候用浅拷贝, 什么时候用深拷贝, 答案是如果一个对象中只包含原始类型的变量,那么就使用浅拷贝, 如果类中有 * 对其它类的引用, 但是其它类是immutable的,仍然使用浅拷贝,如果有对其它类的引用, 而其它类是可被修改的, 就不得不 * 深拷贝了; */ public static void main(String[] args) throws IOException, ClassNotFoundException { Car originalCar = new Car(); originalCar.setBrand("BMW"); originalCar.setPrice(500000); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); objectOutputStream.writeObject(originalCar); objectOutputStream.flush(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream); Car cloneCar = (Car) objectInputStream.readObject(); System.out.println(cloneCar.getBrand()); // BMW System.out.println(cloneCar.getPrice()); // 500000 cloneCar.setBrand("Honda"); cloneCar.setPrice(3000); System.out.println(originalCar.getBrand()); // BMW System.out.println(originalCar.getPrice()); // 500000 System.out.println(cloneCar.getBrand()); // Honda System.out.println(cloneCar.getPrice()); // 3000 } }
相关推荐
在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在对象复制和克隆方面。这个小例子将帮助初学者理解如何在Java中使用`clone()`来创建对象的副本。让我们深入探讨`clone()`方法以及它在实际编程中的...
Java的`clone()`方法在软件开发中扮演着重要的角色,特别是在需要复制对象的场景下。在Java中,对象的复制并非像C++等语言中的指针复制那样简单,因为Java中没有指针的概念,而是使用引用。这导致了在默认情况下,...
在这个例子中,`Person`类实现了`Cloneable`接口,并覆盖了`clone()`方法。`Address`类同样如此,以实现深克隆。在测试代码中,我们创建了一个`Person`对象,并对其克隆。然后,我们修改克隆对象的地址,可以看到...
在Java编程语言中,克隆(Clone)机制是一种创建对象副本的方法,它允许开发者创建一个已有对象的新实例,这个新实例与原对象具有相同的属性值,但却是两个独立的对象,彼此的操作不会互相影响。克隆机制在某些情况...
在Java中,如果一个类想要实现`clone()`方法,必须实现`Cloneable`接口。如果不这样做,Java会抛出`CloneNotSupportedException`异常。`Cloneable`接口本身没有定义任何方法,它的作用就是标记一个类为可克隆的。 ...
clone的用法 希望有帮助,仅供参考 通过例子的分析,可以对克隆的方法有所深入了解
Java中的对象克隆可以通过实现`Cloneable`接口并覆盖`clone()`方法来完成。对象的克隆分为浅拷贝和深拷贝两种形式。 **1. 浅拷贝** 浅拷贝是指创建一个新的对象,然后将原对象的所有非引用类型的成员变量复制到新...
Java中的对象创建主要有两种方式,即使用`new`操作符创建新对象以及通过`clone`方法复制已有对象。本文将从JVM的角度深入探讨Java的`clone`操作,揭示其工作原理及其潜在的问题。 首先,让我们理解`clone`方法的...
Java中的`clone()`方法是Object类的一个成员方法,它提供了创建一个对象副本的功能。这篇文章将深入探讨`clone()`方法的工作原理、使用场景以及浅拷贝(shallow clone)与深拷贝(deep clone)的区别。 首先,让...
在这个例子中,`MyClass`实现了`Cloneable`接口,并覆盖了`clone()`方法。对`str`属性进行深拷贝是因为字符串是不可变的,`new String(this.str)`创建了一个新的字符串对象,而`num`是基本类型,因此无需额外处理。 ...
### Java常用方法集合 #### 一、`java.lang.*`包概述 `java.lang.*` 包含了Java语言中最基本且最常用的类,这些类是自动导入到每一个程序中的,因此无需显式地导入。它包括了如 `String`, `Integer`, `System`, `...
并且由于Java不能通过简单的赋值来解决对象复制的问题,在开发过程中,也常常要要应用clone()方法来复制对象。比如函数参数类型是自定义的类时,此时便是引用传递而不是值传递。以下是一个小例子: ...
在Java中,当我们使用`clone()`方法或`System.arraycopy()`进行复制时,通常得到的是浅复制的结果。这意味着原始对象和复制对象中的引用指向内存中的同一块区域。如果List中的元素是基本类型,这种复制方式是没问题...
在Java中,克隆操作是通过实现`Cloneable`接口和重写`Object`类的`clone()`方法来完成的。但需要注意的是,`clone()`方法默认执行的是浅克隆,因此如果对象中包含对其他对象的引用,这些引用不会被复制。为了实现...
深复制的实现通常需要自定义逻辑,因为Java的`clone()`方法不支持自动的深复制。可以使用序列化(Serialization)和反序列化(Deserialization)来实现深复制,或者手动编写代码递归复制所有属性。例如: ```java ...
4. **创建JCo函数**:使用`JCoDestination`对象的`getFunctionTemplate(functionName)`方法获取到要调用的SAP RFC函数模板,然后通过`clone()`复制一份并调用其`appendParameter()`方法设置参数。 5. **执行RFC调用...
- 实现`Cloneable`接口时,Java官方建议覆盖`clone()`方法并抛出`CloneNotSupportedException`,以避免未实现克隆时的运行时异常。 - 深克隆可能消耗更多内存和时间,因为它需要创建完整的对象树副本。 - 如果对象中...
下面将详细讲解Java中创建对象的五种方法,并通过实际示例进行演示。 1. **使用`new`关键字构造器创建对象** 这是最常见、最直接的方法。每个类都有一个构造器,用于初始化新创建的对象。例如,假设我们有一个名为...