java中的clone()方法的研究---(5)如何编写正确的clone()方法:String类型
2015-04-24 15:24
357 查看
一个自定义Object,它里面的属性如果是String对象类型
三:String:是对象的类型
在自定义类Person中添加一个新的String属性
---------------------------------------------------------------下面开始测试了------------------------------------------------------------------
测试类TestMain:
debug截图:
(ps: 每次debug时候,id所分配的号码会不一样)
通过debug可以发现:
p和pclone的id不一样,说明p和pclone分别指向了两个不同的Person对象
Person对象新增的String属性(name)是对象的类型,所以有id
p.name和pclone.name的id(27)是相同的!
说明,默认的clone()方法,对于对象类型的String来说,依然是浅克隆。
debug展开String内部看来:其String内部是维护了一个char基本类型的value数组
数组,不管它里面存储什么数据类型,其本身也是对象类型,所以有id(31)
我们来看看String类的源代码,进一步证实一下,
那么,对于属性是String的对象类型,虽然被浅克隆了,但是会不会有问题呢?请看下面的进一步测试
debug截图:
(ps: 每次debug时候,id所分配的号码会不一样)
通过debug可以发现:
在运行p.setName("郭美美不美");之后,p.name所指向的对象id变成了新的(id=34),其内部的value数组也是新的(id=35)
pclone.name还是指向原来的对象(id=27)
--------------------------------------------总结------------------------------------------------------------------
总结,一个自定义的Object:
在编写clone()方法的时候,默认的clone()方法行为,针对于String类型是浅克隆(只要是对象类型,都是浅克隆)
但是我们不需要担心,“p.name的值修改了,pclone.name也跟着修改” 的这种情况!
因为String类型,在赋值的时候,并没有修改原来的值!而是重新指向了一个新值的地址,有如下两种赋值方法:
String name = new String("郭美美");
String name = “郭美美”;
所以:一个自定义的Object,针对于String类型,使用默认的clone()方法即可。
----------------------------------------------个人感觉--------------------------------------------------------------------------------------
String类型与Wrapper Class类型的表现行为都是一样的。
他们都有两种赋值方法:
String name = new String("郭美美");
//构造函数赋值
String name = “郭美美”; //直接赋值
Integer height = new Integer(88);
Integer height = 88;
我们来测试一下,这两种赋值方法的区别
通过debug可以发现:
无论是String还是Wrapper Class, 只要通过构造函数赋值,一定会分配新的内存空间:
m1(id=25), m2(id=26)
n1(id=27), n2(id=29)
无论是String还是Wrapper Class,只要直接赋值,一定会指向同一个内存空间
i1, i2 的id都是 20
s1, s2 的id都是 30
但是,String 还是有特殊情况的!!!!
String 内部的value数组,因为在赋值时候,都是“abc”字符串,那么jvm在运行时后,会让因为字符串相同而让value数组指向同一个内存空间(id=31)
三:String:是对象的类型
在自定义类Person中添加一个新的String属性
package tt.vo; public class Person implements Cloneable { // 基本数据类型 private int age; // Wrapper Class类型 private Integer height; // String 类型 private String name; @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 + ", height=" + height + ", name=" + name + "]"; } public Integer getHeight() { return height; } public void setHeight(Integer height) { this.height = height; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
---------------------------------------------------------------下面开始测试了------------------------------------------------------------------
测试类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); p.setHeight(162); p.setName("郭美美"); System.out.println("p:" + p); Person pclone = p.clone(); System.out.println("pclone:" + pclone); } }
debug截图:
(ps: 每次debug时候,id所分配的号码会不一样)
通过debug可以发现:
p和pclone的id不一样,说明p和pclone分别指向了两个不同的Person对象
Person对象新增的String属性(name)是对象的类型,所以有id
p.name和pclone.name的id(27)是相同的!
说明,默认的clone()方法,对于对象类型的String来说,依然是浅克隆。
debug展开String内部看来:其String内部是维护了一个char基本类型的value数组
数组,不管它里面存储什么数据类型,其本身也是对象类型,所以有id(31)
我们来看看String类的源代码,进一步证实一下,
private final char value[];
那么,对于属性是String的对象类型,虽然被浅克隆了,但是会不会有问题呢?请看下面的进一步测试
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); p.setHeight(162); p.setName("郭美美"); System.out.println("p:" + p); Person pclone = p.clone(); System.out.println("pclone:" + pclone); System.out.println("-------------after set-------------------"); p.setAge(180); p.setHeight(190); p.setName("郭美美不美"); System.out.println("p:" + p); System.out.println("pclone:" + pclone); } }
debug截图:
(ps: 每次debug时候,id所分配的号码会不一样)
通过debug可以发现:
在运行p.setName("郭美美不美");之后,p.name所指向的对象id变成了新的(id=34),其内部的value数组也是新的(id=35)
pclone.name还是指向原来的对象(id=27)
--------------------------------------------总结------------------------------------------------------------------
总结,一个自定义的Object:
在编写clone()方法的时候,默认的clone()方法行为,针对于String类型是浅克隆(只要是对象类型,都是浅克隆)
但是我们不需要担心,“p.name的值修改了,pclone.name也跟着修改” 的这种情况!
因为String类型,在赋值的时候,并没有修改原来的值!而是重新指向了一个新值的地址,有如下两种赋值方法:
String name = new String("郭美美");
String name = “郭美美”;
所以:一个自定义的Object,针对于String类型,使用默认的clone()方法即可。
----------------------------------------------个人感觉--------------------------------------------------------------------------------------
String类型与Wrapper Class类型的表现行为都是一样的。
他们都有两种赋值方法:
String name = new String("郭美美");
//构造函数赋值
String name = “郭美美”; //直接赋值
Integer height = new Integer(88);
Integer height = 88;
我们来测试一下,这两种赋值方法的区别
package tt; import tt.vo.Person; public class TestMain { public static void main(String[] args) throws CloneNotSupportedException { Integer i1 = 18; Integer i2 = 18; Integer m1 = new Integer(18); Integer m2 = new Integer(18); String n1 = new String("abc"); String n2 = new String("abc"); String s1 = "abc"; String s2 = "abc"; } }
通过debug可以发现:
无论是String还是Wrapper Class, 只要通过构造函数赋值,一定会分配新的内存空间:
m1(id=25), m2(id=26)
n1(id=27), n2(id=29)
无论是String还是Wrapper Class,只要直接赋值,一定会指向同一个内存空间
i1, i2 的id都是 20
s1, s2 的id都是 30
但是,String 还是有特殊情况的!!!!
String 内部的value数组,因为在赋值时候,都是“abc”字符串,那么jvm在运行时后,会让因为字符串相同而让value数组指向同一个内存空间(id=31)
相关文章推荐
- java中的clone()方法的研究---(3)如何编写正确的clone()方法:基本数据类型
- java中的clone()方法的研究---(8)如何编写正确的clone()方法:数组类型
- java中的clone()方法的研究---(10)如何编写正确的clone()方法:子自定义Object类型
- java中的clone()方法的研究---(9)如何编写正确的clone()方法:Collection
- java中的clone()方法的研究---(4)如何编写正确的clone()方法:Wrapper Class
- java中的clone()方法的研究---(6)如何编写正确的clone()方法:StringBuffer,StringBuilder
- java中的clone()方法的研究---(7)如何编写正确的clone()方法:Date, Timestamp
- java中的clone()方法的研究---(1)自定义的类如何才可以被clone
- java中的clone()方法的研究---(2)浅克隆和深克隆
- 在java中如何将String类型转换成java.sql.Date类型
- 关于java中String类型的split方法问题
- Java基础:String类型下的方法
- java String类型的几个方法
- JAVA 中int类型转String类型的通常方法
- java对象转换String类型的三种方法
- [编写高质量代码:改善java程序的151个建议]建议54:正确使用String,StringBuffer,StringBuilder
- C#中如何实现JAVA中的String.replaceAll()方法功能
- java获取JCombobox 获取int和String类型数据的方法。
- Java语言中,以String作为类型的变量在作为方法参数时所表现出的“非对象”的特性。