先来看看一个自定义Object,它里面的属性都有啥:
- 基本数据类型
- Wrapper Class(基本数据类型的包装类型)
- String
- StringBuffer, StringBuilder
- Java提供的其他类型
- Date
- Timestamp
- Array
- Collection
- 子自定义Object类型
一:基本数据类型:不是对象的类型,所以基本数据类型永远都是深克隆。
基本数据类型在赋值的时候,永远都是传值,而不是传引用。
double m = 4; // 此时, 给变量m,开辟了8bytes的内存空间存储
double n = m; // 此时也会,给变量n,开辟新的8bytes内存空间
那么哪些是基本数据类型,这些基本数据类型又占用多少内存空间呢:
基本数据类型 | 占用内存大小 | 包装类(Wrapper Class) |
byte | 1byte | Byte |
short | 2bytes | Short |
int | 4bytes | Integer |
long | 8bytes | Long |
float | 4bytes | Float |
double | 8bytes | Double |
boolean | 1bit | Boolean |
char | 2bytes | Character |
什么是默认的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()方法即可。