首页 > 编程语言 >java中的clone()方法的研究---(4)如何编写正确的clone()方法:Wrapper Class

java中的clone()方法的研究---(4)如何编写正确的clone()方法:Wrapper Class

时间:2022-12-06 11:02:49浏览次数:43  
标签:java clone getHeight Wrapper height Person pclone Class


一个自定义Object,它里面的属性如果是Wrapper Class对象类型


二:Wrapper Class(基本数据类型的包装类型):是对象的类型


Wrapper Class都有哪些:


基本数据类型

占用内存大小

包装类(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




在自定义类Person中添加一个新的Integer属性

package tt.vo;

public class Person implements Cloneable {

// 基本数据类型
private int age;

// Wrapper Class类型
private Integer height;

@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 + "]";
}

public Integer getHeight() {
return height;
}

public void setHeight(Integer height) {
this.height = height;
}
}


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



测试类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);
System.out.println("p:" + p);

Person pclone = p.clone();
System.out.println("pclone:" + pclone);

System.out.println("p.getHeight()==pclone.getHeight(): "+(p.getHeight()==pclone.getHeight()?"true":"false"));


}

}



debug截图:

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

(ps: 每次debug时候,id所分配的号码会不一样)

通过debug可以发现:

  • p和pclone的id不一样,说明p和pclone分别指向了两个不同的Person对象
  • Person对象新增的Integer属性(height)是对象的类型,所以有id
  • p.height和pclone.height的id(24)是相同的!
  • 说明,默认的clone()方法,对于对象的类型来说,都是浅克隆。
  • debug展开height内部看来:其Integer内部是维护了一个int基本类型的value
    我们来看看Integer类的源代码,进一步证实一下,
private final int value;


我们来看看,这些Wrapper Class其内部对应维护的,基本的数据类型吧




包装类(Wrapper Class)

其内部维护的基本数据类型

Byte

private final byte value;

Short

private final short value;

Integer

private final int value;

Long

private final long value;

Float

private final float value;

Double

private final double value;

Boolean

private final boolean value;

Character

private final char value;

(不信的话,大家可以看看源代码








那么,对于属性是Wrapper Class的对象类型,虽然被浅克隆了,但是会不会有问题呢?请看下面的进一步测试



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);
System.out.println("p:" + p);

Person pclone = p.clone();
System.out.println("pclone:" + pclone);

System.out.println("p.getHeight()==pclone.getHeight(): "+(p.getHeight()==pclone.getHeight()?"true":"false"));

System.out.println("-------------after set-------------------");
p.setAge(180); // 开辟了新的内存
p.setHeight(190); // 并没有修改原来的值!而是让height重新指向了190这个值的地址

System.out.println("p.getHeight()==pclone.getHeight(): "+(p.getHeight()==pclone.getHeight()?"true":"false"));
System.out.println("p:" + p);
System.out.println("pclone:" + pclone);
}

}



debug截图:




java中的clone()方法的研究---(4)如何编写正确的clone()方法:Wrapper Class_浅克隆_02

(ps: 每次debug时候,id所分配的号码会不一样)



通过debug可以发现:


  • 在运行p.setHeight(190);之后,p.height所指向的对象id变成了新的(id=37)
  • pclone.height还是指向原来的对象(id=26)


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



总结,一个自定义的Object:

  • 在编写clone()方法的时候,默认的clone()方法行为,针对于Wrapper Class类型是浅克隆(只要是对象类型,都是浅克隆)
  • 但是我们不需要担心,“p.height的值修改了,pclone.height也跟着修改” 的这种情况!
  • 因为Wrapper Class类型,在赋值的时候,并没有修改原来的值!而是重新指向了一个新值的地址。有如下两种赋值方法:
  • Integer height = new Integer(88);
  • Integer height = 88;
  • 所以:一个自定义的Object,针对于Wrapper Class类型,使用默认的clone()方法即可。



标签:java,clone,getHeight,Wrapper,height,Person,pclone,Class
From: https://blog.51cto.com/u_15903664/5915171

相关文章

  • java线程研究---(6)暂停Thread:join
    暂停Threadjoin方法,会让线程线程暂停,具体如下:调用方法:Thread对象.join()比如,当前有一个线程对象son,当调用了son.join()方法之后(不是child.start()方法哦),会让线程对象son的父......
  • Java通过文件名后缀确定Content-Type中的MIMEType
    转载自根据文件名获取contentType作为一个Java后端,你的项目里面不可能不引用spring的,所以下面提供的是依赖spring-web的方案:publicclassMainTest{publicsta......
  • 字符串转换为java.sql.Date格式的时间
    @Test  publicvoidtest()throwsParseException{    //将字符串转换为java.sql.Date格式的时间    Stringstr="2017-8-16";    Simpl......
  • 盘点JAVA中基于CAS实现的原子类, 你知道哪些?
    前言JDK中提供了一系列的基于CAS实现的原子类,CAS的全称是Compare-And-Swap,底层是lockcmpxchg指令,可以在单核和多核CPU下都能够保证比较交换的原子性。所以说,这些原子......
  • java中List集合的多种遍历方式
    文章目录​​1.for循环遍历​​​​2.for循环的简化版遍历​​​​3.传统迭代器方式​​​​4.forEach遍历​​​​5.stream遍历​​​​附​​新建一个集合用于遍历:L......
  • 【每天一个java设计模式(一)】 - 工厂模式
    工厂模式是Java中最常用的设计模式之一。它属于创建型模式,提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同......
  • 【每天一个java设计模式(零)】 - 设计模式基本概念及七大设计原则
    设计模式概述设计模式是什么?它是软件开发人员在软件开发过程中经过相当长的一段时间的试验和错误总结出来的面临的一般问题的解决方案;它是一套被反复使用的、多数人知晓的、......
  • java中的关键字(含保留字)解析
    文章目录​​概述​​​​关键字解释​​​​abstract​​​​assert​​​​boolean​​​​break​​​​byte​​​​case​​​​catch​​​​char​​​​class​​​......
  • 剖析java中几种创建线程的几种方式
    文章目录​​继承Thread​​​​实现Runnable接口​​​​实现Callable接口​​​​newThread方式的缺点​​​​通过线程池创建​​​​newSingleThreadExecutor​​​​n......
  • 【深入理解java虚拟机】 - JVM字节码指令介绍
    文章目录​​什么是字节码指令​​​​javap的用法​​​​字节码与数据类型​​​​字节码指令集​​​​加载和存储指令​​​​运算指令​​​​类型转换指令​​​​对......