Java高级特性:clone()方法

AT32F421玩转AM32电调:手把手教你调试过零点比较器,告别电机抖动 本文详细介绍了如何使用AT32F421芯片调试AM32电调的过零点比较器,解决电机抖动问题。通过硬件配置、软件环境搭建、比较器电路原理分析及filter_level参数动态调整等实战步骤,帮助开发者精准诊断和优化电机控制性能。 阅读详情

标签:ringbuf   his   硬件   throws   port   protect   序列化   ext   this   

目录

源码

public class Objcet{
    protected native Object clone() throws CloneNotSupportedException();
}

由源码可知。

  • 第一:Objcet类的clone()方法是一个native方法。native方法的执行效率一般远高于Java中的非native方法(一般不是java语言所写)。这也解释了为什么要用Object的clone()方法,而不是先new一个类,然后把原始对象复制到新对象中,虽然这样也能实现clone功能。(JNI是Java Native Interface的 缩写。从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少保证本地代码能工作在任何Java 虚拟机实现下。)
  • 第二:Object类中的clone()方法被protected修饰符修饰。(关于protected修饰符见我的其它文章。)这意味着clone()方法只对java.util.lang包可见,和继承了Object类的子类可见。当然所有类都是继承了Object类。
    • 为什么要用protected修饰呢?
      为了安全,安全性从两方面考虑。首先我们要clone一个Employee对象,应该只有Employee类能够克隆Employee对象。使用protected修饰符保证了其它不相关的类无法克隆Employee对象。其次是Object对要复制的对象一无所知,它只会逐域进行复制,如果对象中的所有数据域都是数值或其他基本类型,拷贝这些域没有任何问题。但是如果对象包含子对象的引用,拷贝域就会得到相同子对象的另一个引用,这样原对象和克隆的对象还会共享一些信息。所以默认的拷贝都是浅拷贝。要想在任何地方都使用clone方法,我们必须将它改为public类型,并且实现Cloneable接口。如果一开始就是public,我们就分不清到底是浅拷贝还是深拷贝了。使用protected和Cloneable就约束了类设计者要了解自己的克隆过程。
      Cloneable接口是标记接口,它不包含任何需要实现的方法。如果一个对象请求克隆,但没有实现这个接口,就会产生一个受检查异常,因为clone方法默认实现中有使用instanceof进行接口判断。
      这里给出代码
//cloneTest.java
package com.testbase.clone;

public class cloneTest {
    public static void main(String[] args){
        // 虽然我们已经实现了Cloneable接口,不会产生异常
        // 但是编译器并不知道,会报错,所以这里要捕获异常
        try
        {
            Employee tobin = new Employee(30000);
            int salary = tobin.getSalary();
            System.out.println(salary);
            Employee shengsheng = tobin.clone();
            int shengSalary = shengsheng.getSalary();
            System.out.println(shengSalary);
        }
        catch (CloneNotSupportedException e)
        {
            e.printStackTrace();
        }
    }
}
//Employee.java
package com.testbase.clone;

public class Employee implements Cloneable
{
    private int salary;
    public Employee()
    {

    }
    public Employee(int asalary)
    {
        salary = asalary;
    }
    @Override
    public Employee clone() throws CloneNotSupportedException
    {
        Employee cloned = (Employee) super.clone();
        return cloned;
    }

    public int getSalary() {
        return salary;
    }
}
  • 第三:Object.clone()方法返回一个Object对象。我们必须进行强制转换才能得到我们需要的类型。(强制转换一定能成功吗?如果重写了clone方法一定成功。但是如果没有重写,不能转换。clone的是父类Object,无法向下造型,子类重写了clone方法,拷贝就是当前类的对象,暂时转为Object,还可以通过强制类型转换回来)
    给出一段错误代码。在Employee.java中拷贝是因为在其它类中拷贝一定不成功。因为Object类clone方法的protected特性。只有继承了它的子类和java.util.lang包可以调用clone()方法。所以选择在子类Employee中测试。
package com.testbase.clone;

public class Employee implements Cloneable
{
    private int salary;
    public Employee()
    {

    }
    public Employee(int asalary)
    {
        salary = asalary;
    }
//    @Override
//    public Employee clone() throws CloneNotSupportedException
//    {
//        Employee cloned = (Employee) super.clone();
//        return cloned;
//    }

    public int getSalary() {
        return salary;
    }

    public static void main(String[] args){
        try
        {
            Employee tobin = new Employee(30000);
            int salary = tobin.getSalary();
            System.out.println(salary);
            Object shengsheng = tobin.clone(); //这里不能强制类型转换
            int shengSalary = shengsheng.getSalary();//这里报错,因为Object没有getSalary方法
            System.out.println(shengSalary);
        }
        catch (CloneNotSupportedException e)
        {
            e.printStackTrace();
        }
    }
}

深拷贝和浅拷贝

浅拷贝:拷贝引用,但是不拷贝引用指向的对象,对拷贝引用的对象进行修改,两份拷贝都会被修改。如果源对象和浅拷贝对象所共享的子对象都是不可变的,那么这种共享就是安全的。比如String类。或者在对象的生命周期内,子对象一直包含着不变的常量,没有更改器方法会改变它,也没有方法会生成它的引用,这种情况同样是安全的。
深拷贝:可能会更改的子对象也进行了拷贝。要进行深拷贝,需要一层层地重写clone方法。

  • 数组是深拷贝。所有数组类型都有一个public的clone()方法,可以用这个方法建立一个新数组。
int[] a = {1,2,3,4};
int[] cloned = a.clone();
cloned[0]=11;

对象串行化实现拷贝

常见面试题

1.为什么进行拷贝

  • 因为我们某个对象实例现在需要保存一些有效值,我们希望生成一个和原来一样的对象,对这个对象的修改不改变原对象的属性。

2.深拷贝和浅拷贝的区别

  • 浅拷贝对基本数据类型生成一份新的拷贝,对引用类型,只是复制了引用,引用所指向的那块内存空间并没有拷贝
  • 深拷贝对引用指向的那块内存空间也拷贝了一份(新内存空间)。换言之深拷贝要把复制的对象所引用的对象也都拷贝了一遍。

3.String克隆的特殊性在那里?StringBuffer和StringBuilder呢?

  • 对基本数据类型都能自动实现深拷贝。而对引用类型是浅拷贝。String是引用类型的特例。因为String是不允许修改的。所以相当于进行了深拷贝,是安全的。由于String是不可变类,对String类中的很多修改操作都是通过new对象复制处理的。所以当我们修改clone前后对象里面String属性的值时,实际上就指向了新的内存空间。自然对clone前的源对象没有影响,类似于深拷贝。虽然它是引用类型,但是不影响我们深拷贝的使用。
    而对于StringBuffer和StringBuilder,需要主动进行clone重写。否则就是浅拷贝。

4.实现对象克隆的常见方式有哪些,具体怎么做?
常用的方式有三种。

  • 通过自己写一个clone方法,new一个同样的对象,赋值实现深度克隆,繁琐容易出错。
  • 通过实现Cloneable接口并重写Object类的clone方法,分为深浅两种方式。
  • 通过Serializable接口并用对象的序列化和反序列化来实现真正的深拷贝。

代码,主要是第2和第3个方法。
通过实现 Cloneable 接口并重写 Object 类的 clone() 方法实现浅克隆做法:Object 类中 clone 方法的默认实现最终是一个 native 方法(如果 clone 类没有实现 Cloneable 接口并调用了 Object 的 clone 方法就会抛出 CloneNotSupportedException 异常,因为 clone 方法默认实现中有使用 instanceof 进行接口判断),相对来说效率高些,默认实现是先在内存中开辟一块和原始对象一样的空间,然后原样拷贝原始对象中的内容,对基本数据类型就是值复制,而对非基本类型变量保存的仅仅是对象的引用,所以会导致 clone 后的非基本类型变量和原始对象中相应的变量指向的是同一个对象。
浅拷贝。

class Employee implements Clonealbe{
    public Employee clone() throws CloneNotSupportedException
    {
        return (Employee) super.clone();
    }        
}

深拷贝

class Employee implements Clonealbe{
    public Employee clone() throws CloneNotSupportedException
    {
        Employee cloned = (Employee) super.clone();
        cloned.hireDay = (Date) hireDay.clone();
        return cloned();
    }        
}

通过Serializable接口并用对象的序列化和反序列化来实现真正的深拷贝。(还未学到)

class CloneUtil {  
   public static <T extends Serializable> T clone(T obj) {  
       T cloneObj = null;
       try {
           ByteArrayOutputStream byteOut = new ByteArrayOutputStream();  
           ObjectOutputStream objOut = new ObjectOutputStream(byteOut);
           objOut.writeObject(obj);  
           objOut.close();  
           ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray()); 
           ObjectInputStream objIn = new ObjectInputStream(byteIn);  
           cloneObj = (T) objIn.readObject();  
           objIn.close();
       } catch (IOException e) {
           e.printStackTrace();
       } catch (ClassNotFoundException e) {
           e.printStackTrace();
       }  
       return cloneObj;  
   }
}
 
 
class InfoBean implements Serializable {  
   public String name;
   public int age;
}
 
 
class PeopleBean implements Serializable {  
   public String vipId;
   public InfoBean infoBean;
 
   public Object clone() {
       return CloneUtil.clone(this);
   }  
}

参考文章:
https://www.cnblogs.com/gw811/archive/2012/10/07/2712252.html
https://blog.youkuaiyun.com/qq_26857649/article/details/84316081

Java高级特性:clone()方法

标签:ringbuf   his   硬件   throws   port   protect   序列化   ext   this   

原文地址:https://www.cnblogs.com/zuotongbin/p/11723346.html

ITKMontage---ITK自动拼接模块 本文分享ITK中Remote中的ITKMontage拼接模块,希望对各位小伙伴有所帮助!1. ITKMontage介绍在医疗图像处理过程中,图像拼接有很多用处,比如DR图像的拼接。ITKMontage可以快速稳定的处理数据量较大的拼接图像。强度不均匀性校正配准全局优化融合2. ITKMontage安装ITKMontageITKMontage可脱离ITK进行单独安装,也可在ITK安装时作为模块进行安装。单独安装ITK模块安装在ITK编译时,选择ITKMontage模块。 阅读详情

相关推荐

matlab kwave模拟超声换能器学习笔记

kwave模拟超声换能器的学习笔记,从零开始造车轮

SolvingMaster的博客 3201

jsp中的九大内置对象(详解和代码)

看完秒懂,再也不会被难倒了o(* ̄▽ ̄*)ブ

psh073014的博客 509

常见卫星图源下载教程

上面列出的8个常见的亚米级别数据源都可以通过xyz协议或者wmts/wms协议进行下载。这些协议是什么?地理信息数据为了方便网络传输,制定了一系列的地理数据传输标准(wms/wmts/xyz等)。协议特点优点缺点栅格数据支持矢量数据支持WMS通过HTTP请求获取GIS数据,服务器会将数据渲染成图像高度定制的地图;交互性强服务器渲染图像,响应时间较长支持有限支持WMTS提供预渲染的地图瓦片速度快,因为地图瓦片可以预先生成并在请求时快速提供瓦片的内容是预先确定的,无法进行定制支持。

锐多宝的地理空间 1万+

VB中Recordset的clone方法

在用vb的时候,发现了个奇怪的问题,见下面代码,在生成Recordset的过程中,调用了recordset的clone方法,clone后沒有做任何操作,及時跟踪的过程中发现clone前的原recordset對象rectemp的recordcount是26,但是但调用Recordset的clone方法后,居然发现clone后新的複製本rectempcopy 比rectemp多了一倍的记录。...

bahua2018的博客 1044

硬件工程师必备核心知识点

硬件设计是一项系统化工程活动,涉及元器件选型、电源设计、信号完整性、EMC和PCB工艺等多个环节

硬核科技 340

STM32CubeMX Nucleo F767ZI 教程(1)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 官网上买了个NUCLEO F767ZI 的开发板,144引脚的芯片,https://www.st.com/content/st_com/zh/products/evaluation-tools/prod

fafuwxm 2030

Java中的克隆close()和赋值引用的区别

学生类Student: package 克隆clone; /*要克隆必须实现这个借口:Cloneable,以标记这个对象可以克隆 Cloneable:此类实现了 Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。 这个接口是标记接口,告诉我们实现该接口的类就可以实现对象的复制了。 */ public class Student im

1368

Ubuntu安装pytorch3d的最便捷方法【原创】

Ubuntu安装pytorch3d的最便捷方法

qq_54900679的博客 2925

源码阅读复习整理

1、谈谈hashCode()方法 第一,hashCode()方法是定义在Object类中的本地方法,子类如果不重写就会默认使用Object类中的hashCode()方法。在官方文档中规定了重写hashCode()方法或JVM虚拟机厂商实现hashCode()方法的规则: 在程序的一次执行过程中,两次调用某一对象的hashCode()方法的返回值是相等的。 两个通过调用equals()方法相等的对象,调用hashCode()方法返回值也相等。 第二,在Object类中hashCode()方法底层是调用C+

weixin_45841729的博客 535

Win11上从零跑通Carla自动驾驶仿真:保姆级环境配置与避坑指南(Python 3.7+)

本文详细介绍了在Win11系统上从零配置Carla自动驾驶仿真环境的完整流程,包括Python 3.7+环境搭建、依赖安装、常见问题排查及性能优化技巧。通过保姆级教程帮助开发者快速避坑,实现稳定的自动驾驶仿真测试环境部署。

weixin_33488239的博客 421

打破RK3588 GPIO中断响应延迟的枷锁,开启高效编程

本文针对RK3588芯片在智能安防和工业自动化应用中出现的GPIO中断响应延迟问题展开深入分析。通过硬件原理剖析,发现延迟主要源于中断控制器优先级设置、线路干扰等硬件因素,以及中断处理函数复杂、内核调度延迟等软件问题。提出硬件优化方案包括合理布局布线、电源稳定设计,软件层面则通过精准配置设备树、精简中断处理函数、利用工作队列等内核机制进行优化。测试结果显示,优化后中断响应延迟从50-80ms降至10-20ms,高负载下也能稳定在50ms以内。文章最后展望了AI技术在中断调度中的潜在应用价值。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 364

修饰符private和protected详解以及调用Object类Clone方法报错:clone() has protected access in java.lang.Object的原因及解决方案

1. 访问修饰符 访问修饰符的权限范围不用多讲,通过如下一张表即可表示,但是使用起来却有很多疑问。public修饰符就不用多讲了,在哪都可以访问;无修饰符的也不用多加分析,就是同包下可以访问。接下来我们分析一下protected和private修饰符。 本类 同一个包 子类 其它包 public √ √ √ √ protected √ √ √ 无修饰符(也称为package-private) √ √ ..

走过路过不要错过 6216

深入解析逆时偏移(RTM)算法及其在C++中的实现

逆时偏移(Reverse Time Migration, RTM)是一种高级地震成像技术,广泛应用于地震勘探中。RTM通过逆时传播波场来构建地震子波,能够提供更高分辨率和更精确的地下构造图像。本文将详细介绍RTM的基本原理,并通过C++代码示例,深入解析如何实现和优化RTM算法。希望这篇文章能够为地球物理学家和C++开发者提供有价值的参考。

qq_38334677的博客 1529

java super.clone_Java高级特性:clone()方法

源码public class Objcet{protected native Object clone() throws CloneNotSupportedException();}由源码可知。第一:Objcet类的clone()方法是一个native方法。native方法的执行效率一般远高于Java中的非native方法(一般不是java语言所写)。这也解释了为什么要用Object的clone(...

weixin_31143391的博客 960

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

深入浅出Java clone技术(2)

 在上一篇中,介绍了java里clone的基本知识。本篇将着重描述如何实现clone。 l clone的实现1.实现Cloneable接口通过上一篇的介绍,我们知道,一个类若要具备clone功能,就必须实现Cloneable接口。做到这一步,clone功能已经基本实现了。Clone功能对我们来说,最主要的还是要能够使用它。那么我们如何才能使用clone功能呢?答案是覆盖Ob

别岸 的专栏 1891

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

深入浅出Java clone技术

这是clone技术介绍的第一篇。本篇主要介绍对象clone技术的基本知识。Clone基本知识储备在Java里提到clone技术,就不能不提java.lang.Cloneable接口和含有clone方法的Object类。所有具有clone功能的类都有一个特性,那就是它直接或间接地实现了Cloneable接口。否则,我们在尝试调用clone()方法时,将会触发CloneNotSupportedExce

Zero'Coffee 1301

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

深入浅出Java clone技术(3)

深入浅出Java clone技术(3)本章将进入clone的高级特性,着重讲述纵深clone技术。Clone通常有两种类型即浅clone和深clone。首先,分析一下两种的不同。浅clone和深clone都是clone,它们本质区别是对象内部的成员属性(非原生类型属性,如int等)在clone时是否处理为引用。如果仍然保留为引用,则称为浅clone,反之称为深clone。其实这两个概念

别岸 的专栏 1164

Java高级特性之clone方法(一)

package three.day.newcharacter; public class ObjectCloneDemo01 { /** * @param args */ public static void main(String[] args) { Professor p = new Professor("jiaoshu",50); Student stu

QQ1130141391的专栏 881

Java 中克隆函数详解 clone()

 Clone基本知识储备 在Java里提到clone技术,就不能不提java.lang.Cloneable接口和含有clone方法的Object类。所有具有clone功能的类都有一个特性,那就是它直接或间接地实现了Cloneable接口。否则,我们在尝试调用clone()方法时,将会触发CloneNotSupportedException异常。下面我们通过对Object类的部分源码的分析,来发

coco403 1530

JAVA_高级特性(hashCode,clone,比较器,Class反射,序列化)

//HashCode方法,JAVA中的对象都有自身的HashCode码class Person02{  private String name;  private int age;  public Person02(String name,int age){  this.name=name;  this.age=age; }  public String toString(){  return "

wjp553650958的专栏 1390

阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第7章:Java基础类库:课时32:对象克隆

所谓的对象克隆指的就是对象的复制,而且属于全新的复制。即:使用已有对象内容创建一个新的对象,如果要想进行对象的克隆需要使用到Object类中提供的clone()方法:protected Object clone​() throws CloneNotSupportedException 所有的类都会继承Object父类,所以所有的类都一定会有clone()方法,但是并不是所有的类都希望被克隆。所以如果要想实现对象克隆 ,那么对象所在的类需要实现一个Cloneable接口,此接口并没有任何的方法提供,是因为它描

Kenny C 113

Java API

Java四种引用 几种引用之间的区别 Java有四种引用: 引用类型 描述 Soft Reference 只要JVM还有空间就不会回收 Weak Reference 即使JVM有空间,也会回收。但是需要调用System.gc() Phantom Reference 总是回收 Soft Reference 通常被用来对象池,如果一开始不知道对象池应该设多大,但是希望对...

oneslide 518

clone()小议

 这是clone技术介绍的第一篇。本篇主要介绍对象clone技术的基本知识。 Clone基本知识储备在Java里提到clone技术,就不能不提java.lang.Cloneable接口和含有clone方法的Object类。所有具有clone功能的类都有一个特性,那就是它直接或间接地实现了Cloneable接口。否则,我们在尝试调用clone()方法时,将会触发CloneNotSupported

gaoflydog的专栏 256

Java高级特性

今天的任务: 1.hashCode()方法作用介绍 2.对象克隆 3.比较器  4.Class类一、hashCode→哈希码   1. 任何类均为Object类的间接子类,所以均继承方法public int hashCode();该方法返回的值一般是通过将该对象的内部地址转换成一

飘一笑的JAVA 668

【Git版本控制】-一文带你弄懂fork, clone, branch 的区别?

本文生动讲解了Git中fork、clone和branch三个核心概念的区别:fork是代码托管平台提供的功能,用于复制远程仓库到个人账户;clone是Git命令,将远程仓库完整下载到本地;branch则是Git的分支功能,允许并行开发不同功能。文章通过生活化比喻和代码示例,帮助读者理解这三个操作的不同用途:fork用于独立开发,clone用于本地工作,branch用于并行开发。最后还介绍了Git工作流等进阶内容,适合Git初学者快速掌握核心概念。

【javatoai17819112191】→Java && python && AI Agent工程师 1680

WinMerge 插件系统完全指南:让 .doc、.class 也能逐行比较

同事改了一份 Word 文档,你却只能看到"两个二进制文件不同"?Java 的 .class 文件改了一行逻辑,比较结果却全是乱码块。这正是 WinMerge 插件系统(Plugin System)要解决的问题:在比较开始之前,先把文件内容转换成可读文本,或者对差异做规范化处理。掌握它之后,Office 文档、Java 字节码、格式化 JSON 都能像普通文本一样逐行对比和合并。 ## 安装一个

gitblog_00449的博客 946
上一篇: idea bookmark 怎么用
下一篇: Springboot,SSM框架比较,区别
ole_triangle_java
博客等级 码龄10年 82粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值