java中的clone()方法的研究---(3)如何编写正确的clone()方法:基本数据类型

来源:互联网 发布:网络装备交易排行榜 编辑:程序博客网 时间:2024/06/06 09:34

先来看看一个自定义Object,它里面的属性都有啥:

  1. 基本数据类型
  2. Wrapper Class(基本数据类型的包装类型)
  3. String
  4. StringBuffer, StringBuilder
  5. Java提供的其他类型
    1. Date
    2. Timestamp
  6. Array
  7. Collection
  8. 子自定义Object类型


一:基本数据类型:不是对象的类型,所以基本数据类型永远都是深克隆


基本数据类型在赋值的时候,永远都是传值,而不是传引用。

double m = 4;// 此时, 给变量m,开辟了8bytes的内存空间存储double n = m;// 此时也会,给变量n,开辟新的8bytes内存空间


那么哪些是基本数据类型,这些基本数据类型又占用多少内存空间呢:

基本数据类型占用内存大小包装类(Wrapper Class)byte1byteByteshort2bytesShortint4bytesIntegerlong8bytesLongfloat4bytesFloatdouble8bytesDoubleboolean1bitBooleanchar2bytesCharacter

什么是默认的clone()方法:见Person类里面的clone()方法

自定义类Person(之后我会不断地,往里面添加各种类型的属性奋斗


package tt.vo;public class Person implements Cloneable {// 基本数据类型private int age;@Overridepublic Person clone() throws CloneNotSupportedException {Person p = (Person) super.clone();return p;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person [age=" + age + "]";}}




---------------------------------------------------------------下面开始测试了-----------------------------------------------------------------------------

测试类TestMain:


package tt;import tt.vo.Person;public class TestMain {public static void main(String[] args) throws CloneNotSupportedException {// initialize Person pPerson p = new Person();p.setAge(18);System.out.println("p:" + p);Person pclone = p.clone();System.out.println("pclone:" + pclone);}}

debug截图:



通过debug可以发现:

  • p和pclone的id不一样,说明p和pclone分别指向了两个不同的Person对象
  • Person对象只有一个属性(int age)
  • 基本数据类型在debug时候是没有id的(在这里,可见基本数据类型和对象类型的区别哦大笑

下面修改一下测试类TestMain:

package tt;import tt.vo.Person;public class TestMain {public static void main(String[] args) throws CloneNotSupportedException {// initialize Person pPerson p = new Person();p.setAge(18);System.out.println("p:" + p);Person pclone = p.clone();System.out.println("pclone:" + pclone);System.out.println("-------------after set-------------------");p.setAge(180);System.out.println("p:" + p);System.out.println("pclone:" + pclone);}}


debug截图:




通过debug可以发现:
  • p.setAge(180); 之后,仅仅是p.age的value更改了,
  • pclone.age的value保持不变


--------------------------------------------总结------------------------------------------------------------------

总结,一个自定义的Object:

  • 在编写clone()方法的时候,针对基本数据类型属性,不用特殊处理。
  • 使用默认的clone()方法即可。
  • 在调用默认的clone()方法时候,这些基本数据类型属性都会成功的深克隆。
  • 所以:一个自定义的Object,针对基本数据类型属性,使用默认的clone()方法即可。






0 0
原创粉丝点击