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

先来看看一个自定义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)
byte1byteByte
short2bytesShort
int4bytesInteger
long8bytesLong
float4bytesFloat
double8bytesDouble
boolean1bitBoolean
char2bytesCharacter

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

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


package tt.vo;

public class Person implements Cloneable {

	// 基本数据类型
	private int age;
	
	@Override
	public Person clone() throws CloneNotSupportedException {
		Person p = (Person) super.clone();
		return p;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public 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 p
		Person 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 p
		Person 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()方法即可。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值