精华内容
下载资源
问答
  • 关于克隆

    2021-04-04 17:53:20
    关于克隆1、前言2、克隆3、浅克隆3、深克隆 1、前言 因为最近在了解设计模式,其中创建型模式中有一种原型模式,该模式采用克隆的方式,克隆原型实例,来生成一个克隆对象,提供给调用者。关于克隆,以前在看Object...

    1、前言

    因为最近在了解设计模式,其中创建型模式中有一种原型模式,该模式采用克隆的方式,克隆原型实例,来生成一个克隆对象,提供给调用者。关于克隆,以前在看Object类源码时,看到有一个clone方法,但是没太在意,所以也不太了解,看来需要有一些了解了。

    2、克隆

    什么是克隆?可以简单的理解为复制,我们在电脑上进行文件复制的时候,实际上就是属于克隆。但是有时候克隆和复制并不是完全等同的。Java中的克隆主要指对象的克隆,即我new出来一个对象,然后通过clone方法对这个对象进行克隆,那么将会产生一个与这个原型实例等同的克隆实例。

    先看api文档:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    通过api文档,获取到了几个主要的信息:克隆需要覆写Object类中clone方法,然后调用super.clone来返回一个克隆对象。产生对象的类需要实现java.lang.Cloneable接口,否则会抛出异常。最后就是关于浅克隆和深克隆的问题。

    先进行一个简单的测试。创建一个实现Cloneable接口的实体类,如下:

    /*
     * 如果需要克隆该类的实例,那么这个类必须要实现Cloneable接口
     */
    public class User implements Cloneable {
    
        private String name;
    
        private String sex;
    
        private Integer age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        // 覆写Object类中的clone方法
        @Override
        protected Object clone() throws CloneNotSupportedException {
            // 克隆对象的话,可以直接使用super.clone()来获得
            return super.clone();
        }
    
        // 覆写equals方法,规定相等原则
        @Override
        public boolean equals(Object obj) {
            User u = (User)obj;
            if(this.getName().equals(u.getName()) &&
                    this.getSex().equals(u.getSex()) &&
                    this.getAge() == u.getAge()) {
                return true;
            }
            return false;
        }
          
    }
    
    

    java.lang.Cloneable接口的源码:
    在这里插入图片描述
    接口中并没提供太多有用的内容,它链接到了Object类中的clone方法。

    java.lang.Object类的部分源码:
    在这里插入图片描述
    值得注意的是,clone方法是一个native本地方法,那就不去研究那么多了,直接用就行,这个方法会抛出CloneNotSupportedException的异常,当且仅当需要产生克隆对象的类没有实现Cloneable接口时才会抛出这个异常。

    public class Test {
    
        public static void main(String[] args) throws CloneNotSupportedException {
            User u = new User();
            u.setName("ycz");
            u.setSex("男");
            u.setAge(25);
            // 这种是引用地址的赋值,相当于栈中的u和u2都指向堆中的同一实例
            User u2 = u;
            System.out.println(u == u2);
            System.out.println(u.equals(u2));
            System.out.println(u.getClass() == u2.getClass());
            System.out.println("----------------");
            // 使用clone方法克隆对象
            User u3 = (User) u.clone();
            System.out.println(u == u3);
            System.out.println(u.equals(u3));
            System.out.println(u.getClass() == u3.getClass());
            System.out.println("姓名:" + u3.getName());
            System.out.println("性别:" + u3.getSex());
            System.out.println("年龄:" + u3.getAge());
        }
    
    }
    
    

    在这里插入图片描述
    可以看到,克隆出来的对象和原型实例,引用地址是不同的,由于重写了equals方法,所以此方法的比较返回了结果true。不管是原型对象,还是克隆实例,它们的运行时类是一样的,这一点无论怎样都不会改变。

    3、浅克隆

    api文档中提到了浅克隆和深克隆这两个概念,先看浅克隆。

    浅克隆仅仅只克隆对象本身,包括一些基本类型数据,但是它不会克隆对象包含的引用所指向堆中的对象。

    什么意思呢,这话听起来有一点绕,通俗的讲,就是基本类型数据可以克隆,但是引用的对象不会克隆,就是说克隆对象和原型实例的引用所指向的是堆中的同一对象。

    创建一个Dog类:

    public class Dog implements Cloneable {
    
        private String name;
    
        private String bodyColor;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getBodyColor() {
            return bodyColor;
        }
    
        public void setBodyColor(String bodyColor) {
            this.bodyColor = bodyColor;
        }
        
        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    
    }
    

    修改User类:
    在这里插入图片描述
    只是添加了一个引用类型的成员属性和它的get/set方法。然后测试:

        public static void main(String[] args) throws CloneNotSupportedException {
            User u = new User();
            u.setName("ycz");
            u.setSex("男");
            u.setAge(25);
            Dog dog = new Dog();
            dog.setName("李狗蛋");
            dog.setBodyColor("白色");
            u.setDog(dog);
            // 浅克隆
            User u2 = (User) u.clone();
            u2.setName("云过梦无痕");
            Dog d = u2.getDog();
            d.setName("小钢蛋儿");
            d.setBodyColor("黑白相间");
            System.out.println("原型实例如下:");
            System.out.println("姓名:" + u.getName());
            System.out.println("性别:" + u.getSex());
            System.out.println("宠物狗狗的名字:" + u.getDog().getName());
            System.out.println("宠物狗狗的毛色:" + u.getDog().getBodyColor());
            System.out.println("-------------------------");
            System.out.println("克隆实例如下:");
            System.out.println("姓名:" + u2.getName());
            System.out.println("性别:" + u2.getSex());
            System.out.println("宠物狗狗的名字:" + u2.getDog().getName());
            System.out.println("宠物狗狗的毛色:" + u2.getDog().getBodyColor());
        }
    

    在这里插入图片描述
    可以看到,上面只改了克隆对象中引用对象的属性值,但是原型实例中也一并改变了,说明浅克隆出来的对象中所包含的引用和原型实例中的引用指向的是同一个对象,也就是浅克隆只能克隆基本数据类型,无法克隆引用类型。

    3、深克隆

    深克隆和浅克隆的区别在于深克隆可以克隆引用类型。

    修改User类中的clone方法,进行两次克隆,如下:
    在这里插入图片描述
    测试代码不用改,再测试一次:
    在这里插入图片描述
    可以看到,修改克隆对象的引用对象属性值,原型对象的引用对象属性值不会发生改变,间接的说明了克隆对象中的引用和原型对象中的引用指向的不是堆中同一个对象,也说明了深层次的克隆是完全克隆原型实例,包括基本数据和引用类型,这也是和浅克隆的区别,注意即可。

    展开全文
  • 关于克隆 --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3884817.html"谢谢-- 1.假克隆 如: ObjectA objA = new ObjectA(); ObjectB objB = objA; (对于引用变量而言,使用"="将修改...

    关于克隆

    --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3884817.html"谢谢--

    1.假克隆
    如:
    ObjectA objA = new ObjectA();
    ObjectB objB = objA;
    (对于引用变量而言,使用"="将修改引用,而不是复制堆中的对象,
    此时两个引用变量将指向同一个对象,因此,若是一个变量对其进行修改则会改变另外一个变量)
    当修改objA时,objB也被修改,故称之为"假克隆"

    2.浅克隆
    当克隆对象时,需要使用clone()方法:
    public Object clone() throws CloneNotSupportedException(默认情况下,该方法实现浅克隆)
    由于该方法是受保护的方法,通常需要重写该方法并将访问权限改为public。
    该方法将类中各个域进行复制,对于引用类型的域,这种操作会出现问题,故称之为"浅克隆"
    提供克隆的类需要实现Cloneable接口,否则使用clone()方法时会抛出CloneNotSupportedException。
    @Override
    public ObjectA clone(){
    ObjectA objA = null;
    try{
    objA = (ObjectA)super.clone();
    }catch(CloneNotSupportedException e){
    e.printStackTrace();
    }
    return objA;
    }

    注意:对于类中的域,如果只包含基本类型和不可变的引用类型,如String,或者对象在其生命周期内不会发生变化,则可以使用浅克隆来复制对象。
    3.深克隆
    当克隆对象时,需要使用clone()方法:
    public Object clone() throws CloneNotSupportedException
    (其中ObjectA类是ObjectB类中的一个属性)
    @Override
    public ObjectB clone(){
    ObjectB objB = null;
    try{
    objB = (ObjectB)super.clone();
    objB.objA = objA.clone();
    }catch(CloneNotSupportedException e){
    e.printStackTrace();
    }
    return objB;
    }
    注意:通常情况下,克隆对象时都需要使用深克隆。但是需要注意的是,如果引用类型中还有可变的引用类型域,
    则该域也需要被进行克隆,如上面的ObjectA类如果增加一个X域,则该域也需要被克隆。

    4.序列化实现深克隆
    对于深克隆而言,如果有很多引用类型的域,那么重写clone()方法一次复制各个域是非常麻烦的,
    如果引用类型的域也是由引用类型组成的,则应该考虑使用序列化的方式实现深克隆。
    使用序列化写入完成再读出即可实现克隆,此种方法不用考虑引用类型的域,编写clone()方法相对简单,但是要求引用类型也实现Seralizable接口
    (若是使用了API中的类且该类并没有实现Seralizable接口,则该域需要使用transient修饰)

    ObjectB:
    public class ObjectB implements Serializable{
    ……
    @Override
    public ObjectB clone(){
    ObjectB objB = null;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try{
    //将对象写入到字节数组中
    ObjectOutputStream oos = new ObjectOutputStream(baos);
    oos.writeObject(this);
    oos.close();
    }catch(IOException e){
    e.printStackTrace();
    }
    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
    try{
    //从字节数组中读取对象
    ObjectInputStream ois = new ObjectInputStream(bais);
    objB = (ObjectB)ois.readObject();
    ois,close();
    }catch(IOException e){
    e.printStackTrace();
    }
    return objB;
    }
    }

    对于任何序列化对象,都要求实现Seralizable接口,若是域中有引用类型,则要求该引用类型也实现Seralizable接口。
    (效率比直接克隆各个引用类型域慢)

    总结:
    如果类的各个域是基本类型或不可变类型,则可以使用浅克隆,否则使用深克隆
    如果类的域比较复杂,可以使用序列化的方式实现,否则应该使用复制域的方式实现深克隆。

    转载于:https://www.cnblogs.com/XHJT/p/3884817.html

    展开全文
  • 关于克隆虚拟机后mysql主从配置问题, 本人MacOs系统,VMware虚拟机( centos 6,mysql5.7 ) ` ` 问题背景/问题描述: 我准备的从结构虚拟机是克隆的,存在两个问题 第一: ·······配置完成网卡信息,service ...

    关于克隆虚拟机后mysql主从配置问题,

    本人MacOs系统,VMware虚拟机( centos 6,mysql5.7 )
    `

    `

    问题背景/问题描述:

    我准备的从结构虚拟机是克隆的,存在两个问题
    第一:
    ·······配置完成网卡信息,service network restart时,报错Error:No suitable device found: no device found for connection “System eth0”
    第二:
    ·······所有配置完成后,在从结构start slave,报错Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
    `

    `

    问题分析:

    这两个问题,归根结底是由一个原因造成的:克隆
    克隆过来的虚拟机和另一个一模一样,这就造成已知的两个标志着网卡唯一和硬件唯一的标识符重复:Mac码和UUID编码。这就意味着,咱克隆出来的这台虚拟机其实不是一台独立唯一的电脑,那么问题就很好解决了,修改这两个东西就ok。

    MAC地址是一个用来确认网络设备位置的位址,他用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址
    百度百科:Mac地址

    UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成的API。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和随机数。
    百度百科:UUID

    ·
    ·

    问题解决:

    window版的VMware和Mac版的操作都差不多,思路是一样的

    第一:修改Mac地址

    ·······既然Mac地址是网卡的唯一标识,那么就删除原有网络适配器,再重新添加一个就ok了。

    打开虚拟机设置,进入网络适配器
    在这里插入图片描述
    移除网络适配器
    在这里插入图片描述
    新建网络适配器,并生成新的Mac地址,可以复制一下
    在这里插入图片描述
    在这里插入图片描述
    重启虚拟机,打开终端,

    ifconfig
    记住圈住的三个东西,下面需要改,分别是网卡名,物理地址,IP地址

    在这里插入图片描述

    vi /etc/sysconfig/network-scripts/ifcfg-eth0
    圈住的7条,相应的改了,咱的Mac地址就是这里面的HWADDR

    在这里插入图片描述
    然后保存退出,service network restart,搞定,妥妥滴!
    在这里插入图片描述

    第二:解决UUID

    这个东西,你配完网卡就可以搞。
    在终端命令行下输入这一句命令就可以。
    在这里插入图片描述
    根据每个人的配置的mysql文件路径不同,命令有差异。
    这个是我的文件地址命令:
    mv /var/lib/mysql/auto.cnf /var/lib/mysql/auto.cnf.bak

    这个是我在网上找的一哥们的文件地址命令
    mv /mysql/data/auto.cnf /mysql/data/auto.cnf.bak

    大家伙别盲目复制哈!!!!

    你需要做的是找到你配置的mysql文件夹下auto.cnf文件,然后再加个.bak的后缀就完事儿了。

    这个状态是对的:这个状态才是对的

    对了,防火墙记得处理一下哈,要么开放mysql服务对应的3306端口,
    要么就粗暴的service iptadles stop(仅供教学学习情况下使用此命令)
    切记切记切记,重要的事情说三遍
    生产环境下请勿关闭防火墙!!!!!!!!

    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    这里是学前端的练小白的每日点滴
    如书写有误,望大佬们不吝赐教,万分感谢
    持续更新中(Q:1134913446)
    展开全文
  • 关于克隆猴-中中华华的几点你不知道的事 克隆猴的细胞来源是一只流产的母猴胎儿,也就是说,这只猴宝宝本来已经死了,但是它奇迹般的以2只克隆猴的形态复活了。 除了占满眼球的由胎儿细胞克隆成功的...

    关于克隆猴-中中华华的几点你不知道的事


    1. 克隆猴的细胞来源是一只流产的母猴胎儿,也就是说,这只猴宝宝本来已经死了,但是它奇迹般的以2只克隆猴的形态复活了。

    2. 除了占满眼球的由胎儿细胞克隆成功的猴,还有1组用成年猴的体细胞克隆的猴,由此有另外2只克隆猴出世,只是都在30个小时内死亡了。

    3. 存活的克隆猴用的是成纤维细胞(fibroblast cell),成年猴用的细胞是卵丘细胞(cumulus cell)

    4. 克隆猴选用了127个卵细胞,109个抽取细胞核,79个注入细胞核,21个再生,6个代孕,2个出生,2个存活。这存活率,屌爆了。


      Donor cells Oocytes SCNT embryos Embryos transferred Surrogates Pregnancies Live birth Survived offspring
      Fetal fibroblasts 127 109 79 21 6 2 2
      Cumulus cells 290 192 181 42 22 2 0
    5. 成年猴体细胞的克隆猴实验使用了2倍的细胞并且代孕了22个,可惜都没成功。

    6. 克隆猴是怎么一步一步克隆出来的?见下图

      Opens large image

      A:培养皿中的成纤维细胞,取自母猴胎儿

      B->C:把染色体(DNA)从卵母细胞中取出

      D:用激光在卵母细胞壁划一道口子让体细胞能进去

      E:注射体细胞

      F:体细胞成功注入卵母细胞体内

      G:检查体细胞与去核的乱母细胞融合情况

      H:过1-2小时用离子霉素和6-dimethylaminopurine激活合成的细胞,可见单核的晶胚

      I->K:I/D/T/K助长晶胚

      以上步骤均在试管完成,培养好后放入代孕的猴妈妈子宫里面,检查胎儿在子宫的发育情况,经过约140-150天,克隆猴剖腹产出世。

      Opens large image

    7. 夭折的克隆猴,在零下80度冷冻,在2018年1月检查死因,其中一只为新生儿肺透明膜病,呼吸不好挂了,另外一只畸形,也是呼吸困难挂了。

    8. 克隆猴并不是我国科学家首先尝试,只是其他科学家做克隆猴实验的时候都在妊娠80天内就失败了,而我们成功了。

    9. 克隆猴诞生前,已经有23个物种被成功克隆过,包括羊、老鼠、牛、猪、猫、够等等。

    10. 克隆猴分别是2017年11月27日和12月5日诞生的,但是却在今天2018年1月25日才报导的,原因是因为2017年12月21号往Cell期刊投稿,2018年1月11号递交修改稿,2018年1月16号被接受,在2018年1月24日才被Cell官网刊登,然后我们才大幅的报导。另外纸质杂志要更晚一些。

    11. 为什么学术期刊刊登才报导,因为很难保证国际舆论会如何看代这个事件,如果学术期刊不接受,那就不能认为是科学研究科技进步,会带来负面影响。

    12. 我国对克隆猴的报导都是正面的,推进科学发展的,国外的报导就必然会加入伦理道德批判了。





    以上内容来源于Cell杂志,参考原文

    ​http://www.cell.com/cell/fulltext/S0092-8674(18)30057-6




    展开全文
  • scratch关于克隆停止的问题

    千次阅读 2019-03-15 09:43:44
    克隆这个代码在scratch中用处挺大的,但是在用的过程中也会出现一些问题,比如说克隆在到达一定数量之后会停止继续克隆。 这是由于克隆是有个数限制的,昨天测了一下克隆体的个数限制是300个左右。 如何去测:就是...
  • [20121108]关于克隆数据库的问题.txt前几天在克隆数据库生产系统数据库时,遇到一个非常奇怪的问题,记录一下:克隆的机器口令文件,以及spfile以前都存在,实际上很简单,先停止旧数据库,然后改安装目录名(害怕还要使用!...
  • 关于克隆列表的问题

    2019-07-18 22:58:58
    在python中不仅仅只有切片可以克隆列表,内置模块copy也可以克隆 具体实现: import copy #内置模块 def removeDups(L1,L2): '''假设L1,L2是列表, 删除L2中出现的L1中的元素''' L3 = copy.deepcopy(L1)...
  • 关于克隆的linux系统重启后无法联网的一种情况解决(版本:centOS 7 64位) 最近,在使用vware搭建Linux虚拟机过程中遇到一些常见的问题,对此对其中的较为费劲的问题进行了总结与记录,希望能对使用虚拟机无法联网...
  • 在虚拟机中,为了方便我们经常会使用到克隆功能。但是克隆完之后所有的文件都是一样的,包括IP地址、mac地址、uuid等。 在搭建主从复制的时候,如果uuid是一样的,那么就不能搭建成功。 现在介绍下更改MySQL的uuid...
  • 关于克隆JSON对象

    2013-04-01 15:23:16
    偶然发现有不少人不会写, 于是写一个送给大家。 [code="java"] function cloneNode(node) { if (typeof(node) === "object") { var newNode = {}; ... re...
  • 1、本地得克隆方法 //克隆,复制数据 function cloneData(val) { return JSON.parse(JSON.stringify(val)); }; 解决办法就是把你当前操作的这个对象再克隆一份,
  • // 这个克隆出来 是个函数 并不是数字了,有问题  var cS =str3.clone();  var co=obj.clone();  var ca=arr.clone();  console.log("以下是 克隆"+num)  console.log(cn); // {clone: ƒ}  console.log...
  • centos 6.7查看ifconfig 发现没有网卡然后设置: ifconfig eth1 up查看ifconfig 得到mac地址修改文件 /etc/systemconfig/network-scripts/ifcfg-eth0改名为ifcfg-eth1打开文件:1.更改名字为eth1 2....
  • 作为一个4年多Android开发者 最近开始学习flutter;...克隆的时候,因为这个项目比较大,如果没有科学上网的话,会报错接收的文件太大, 所以可以使用git clonegit://github.com/alibaba/flutte...
  • 1. gitLab项目clone过后, 运行ng serve出错: 解决方式: npm install -g node-gyp npm install --global --production windows-build-tools 2. node-sass因为环境变化(如:别人从Mac OS吧代码提交到git,你...
  • publicclassHouseimplementsCloneable{privateintid;privatedoublearea;privatejava.util.DatewhenBuilt;publicHouse(intid,doublearea){this.id=id;this.area=area;whenBuilt=newjav...public class House implemen...
  • vmlite虚拟机启动出错,就把这个虚拟机删除掉重新建立,系统虚拟硬盘使用之前的,启动系统后不能上网,通过ifconfig查看网卡没启动,遂启动网卡服务,但是出错,就是:device eth0 does not seem to be present, ...
  • 关于克隆技术的思考

    千次阅读 2004-08-22 17:20:00
    摘要 :对克隆人问题进行讨论有重要的现实意义。就"要不要克隆人"的问题 ,国内外学界有赞成派与反对派之争。本文对这场论战存在的问题、目前的态势以及将来的前景 ,作出了自己的分析与评论。关键字:克隆技术 克隆人...
  • 在一次生产下克隆服务器到测试环境过程中,发现克隆后相关网络配置等都修改为测试环境,但死活出现tomcat启动后报如下错误:严重: StandardServer.await: create[localhost:8021]:通过排查发现/etc/hosts中绑定的是...
  • 由于克隆出来的虚拟机跟原虚拟机是一模一样的,包括各种配置文件,所以首先需要修改MAC地址。 需要修改的文件有 /etc/udev/rules.d/70-persistent-net.rules /etc/sysconfig/network-scripts/ifcfg-eth0 做...
  • 关于深浅克隆

    2019-10-06 02:12:10
    关于深浅克隆 Code usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Threading; ...
  • 关于深度克隆

    2020-11-27 09:48:13
    vue中类似于dialog表单添加中的数据单独抽离外部js中,然后...另外关于外部js使用this问题 main.js var vue = new Vue({ el: ‘#app’, router, store, render: h => h(App) }) export default vue; 在你需要的外部j
  • 关于克隆的思考

    2021-03-12 23:04:44
    关于克隆的思考深克隆需要考虑的问题JSON实现克隆方式比较满意的克隆克隆需要考虑的问题 需要支持7种基本数据类型:number\string\boolean\symbol\null\undefined\Object JSON 克隆不支持函数、引用、...
  • 克隆: 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用任指向与原来的对象,换言之,浅克隆仅仅复制所克隆的对象,而不复制它所引用的对象。 实现方式: 被克隆的需对象实现Cloneable...
  • 关于java克隆

    2016-06-20 08:34:14
    一个类实现了cloneable接口如果不重写就不能调用clone函数这是为什么?就比如下面呢个不重写clone就不能调用clone函数 ... public class _13_11_Octagon { public static void main(String[] args) throws ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,977
精华内容 1,190
关键字:

关于克隆