JAVA对象clone方法代码实例解析
1.Cloneable接口
这个接口一个方法都没有,但是要使用clone方法,就必须实现这个接口,否则抛出CloneNotSupportedException异常
2.clone方法的返回值
先附上两个类代码
package pojo; /** * @Author : ZGQ * @Date : 2020/3/11 22:12 * @Version : 1.0 */ public class Person implements Cloneable{ String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override protected Object clone() throws CloneNotSupportedException { System.out.println(super.clone().getClass()); Person p = (Person) super.clone(); p.name=this.name; p.age=this.age; return p; } }
package pojo; /** * @Author : ZGQ * @Date : 2020/3/11 22:21 * @Version : 1.0 */ public class Girl extends Person { char cup; public Girl(String name, int age, char cup) { super(name, age); this.cup = cup; } @Override public Object clone() throws CloneNotSupportedException { System.out.println(super.clone().getClass()); Girl girl = (Girl) super.clone(); girl.cup=this.cup; return girl; } @Override public String toString() { return "Girl{" + "cup=" + cup + ", name='" + name + '\'' + ", age=" + age + '}'; } }
我一开始很困惑,为什么clone方法可以将父类的实例交给子类的引用,输出一看才知道,在第一次clone时,创建的就是子类的对象
再创建一个boys类,或者直接调用Person.clone也一样,谁调用clone方法,就创建谁的实例
调用girl.clone()
调用person.clone()
调用boy.clone()
3.如果一个类没有实现Cloneable接口,那它就不可以被clone,它的子类也就不可能实现真正的深复制
多嘴一句,为什么不把clone方法定义在Cloneable中呢?
4.以上写法就是深复制的写法
5.为什么调用clone出来的是子类的实例呢?
可以显而易见的是确实这样比较合乎情理,但是java语言向我们隐瞒了实现细节,又是一个开后门的语法,像包装类可以使用运算符直接运算一样无耻
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
相关推荐
-
java object 之clone方法全面解析
1 protected native Object clone() throws CloneNotSupportedException; 1.方法由native关键字修饰 java中的native关键字表示这个方法是个本地方法,[java native说明].而且native修饰的方法执行效率比非native修饰的高. 2.方法由protected修饰 一个类在覆盖clone()方法时候,需要修改成public访问修饰符,这样才能保证其他所有的类都能够访问这个类的这个方法. 3.方法抛出Clon
-
Java中的clone方法详解_动力节点Java学院整理
Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那么在java语言中,有几种方式可以创建对象呢? 1 使用new操作符创建一个对象 2 使用clone方法复制一个对象 那么这两种方式有什么相同和不同呢? new操作符的本意是分配内存.程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间.分配完内存
-
详解java中的深拷贝和浅拷贝(clone()方法的重写、使用序列化实现真正的深拷贝)
1.序列化实现 public class CloneUtils { @SuppressWarnings("unchecked") public static <T extends Serializable> T clone(T object){ T cloneObj = null; try { ByteArrayOutputStream out = new ByteArrayOutputStream(); ObjectOutputStream obs = new Objec
-
Java Clone深拷贝与浅拷贝的两种实现方法
1.首先,你要知道怎么实现克隆:实现Cloneable接口,在bean里面重写clone()方法,权限为public. 2.其次,你要大概知道什么是地址传递,什么是值传递. 3.最后,你要知道你为什么使用这个clone方法. 先看第一条,简单的克隆代码的实现.这个也就是我们在没了解清楚这个Java的clone的时候,会出现的问题. 看完代码,我再说明这个时候的问题. 先看我要克隆的学生bean的代码: package com.lxk.model; /** * 学生类:有2个属性:1,基本属性-S
-
Java 数组复制clone方法实现详解
这篇文章主要介绍了Java 数组复制clone方法实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.源码 public class Test1 { public static void main(String[] args) { // Student[] arrs = new Student[] { new Student() { id = "22" } }; C# 可以简写法,Java不支持 Student[] arrs
-
java 中clone()的使用方法
java 中clone()的使用方法 前言: clone就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那么在java语言中,有: 1 使用new操作符创建一个对象 2 使用clone方法复制一个对象 那么这两种方式有什么相同和不同呢? new操作符的本意是分配内存.程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间.分配完内存之后,
-
Java clone方法详解及简单实例
Java clone方法详解 什么是"clone"? 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能 会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的.在 Java语言中,用简单的赋值语句是不能满足这种需求的.要满足这种需求虽然有很多途径,但实现clone()方法是其中最简单,也是最高效的手段. Java的所有类都默认继承java.lang.
-
浅析Java中clone()方法浅克隆与深度克隆
现在Clone已经不是一个新鲜词语了,伴随着"多莉"的产生这个词语确实很"火"过一阵子,在Java中也有这么一个概念,它可以让我们很方便的"制造"出一个对象的副本来,下面来具体看看Java中的Clone机制是如何工作的? 1. Clone&Copy 假设现在有一个Employee对象,Employee tobby =new Employee("CMTobby",5000),通 常我们会有这样的赋值Employ
-
JAVA对象clone方法代码实例解析
1.Cloneable接口 这个接口一个方法都没有,但是要使用clone方法,就必须实现这个接口,否则抛出CloneNotSupportedException异常 2.clone方法的返回值 先附上两个类代码 package pojo; /** * @Author : ZGQ * @Date : 2020/3/11 22:12 * @Version : 1.0 */ public class Person implements Cloneable{ String name; int age; p
-
java合并list方法代码实例
这篇文章主要介绍了java合并list方法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 List包括List接口以及List接口的所有实现类.因为List接口实现了Collection接口,所以List接口拥有Collection接口提供的所有常用方法,又因为List是列表类型,所以List接口还提供了一些适合于自身的常用方法 方法一 List<Children> reduce = list.stream() .map(x ->
-
Java多线程CAS操作原理代码实例解析
CAS操作号称无锁优化,也叫作自旋:对于一些常见的操作需要加锁,然后jdk就提供了一些以Atomic开头的类,这些类内部自动带了锁,当然这里的锁并非是用synchronized来实现的,而是通过CAS操作来实现的: 一.下面是 AtomicInteger 的使用: package com.designmodal.design.juc01; import java.util.ArrayList; import java.util.List; import java.util.concurrent.
-
Javascript组合继承方法代码实例解析
组合继承 组合继承,指将原型链和借用构造函数的技术组合到一块,从而发挥二者之长的一种继承模式.其背后思路使用用原型链实现对原型属性和方法的继承,而通过构造函数来实现对实例属性的继承.这样,即通过在原型上定义方法实现了函数复用,又能够保证每个实例都有它自己的属性. 下面来看一个例子 function SuperType(name) { this.name = name; this.color = ['red', 'blue', 'green']; }; // SuperType.prototype
-
Jquery ajax书写方法代码实例解析
Ajax在前端的应用极其广泛,因此,我们有必要对其进行总结,以方便后期的使用. AJAX优点: 可以异步请求服务器的数据,实现页面数据的实时动态加载, 在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容. jquery在全局对象jquery(也就是$)绑定了ajax()函数,可以处理Ajax请求,ajax常用的配置选项有: async 是否异步执行,默认为True,千万不要指定为False method 发送的Method,缺省为"GET",可指定为'POST','P
-
Java初始化List方法代码实例
List指的是集合.<>是泛型,里面指定了这个集合中存放的是什么数据. 比如有一个学生类Student,Student里面包含了学生的一些信息.这样每一个Student对象就代表了一个学生.此时List<Student>就代表这个集合中存放了很多个学生对象,这个集合就像一个班级一样. 第一种 /** * 第一种方式 * 常规方式 */ @Test public void one(){ List<String> languages = new ArrayList<&
-
Java Session验证码案例代码实例解析
案例 用户输入用户名,密码以及验证码. 如果用户名和密码输入有误,跳转登录页面,提示:用户名或密码错误 如果验证码输入有误,跳转登录页面,提示:验证码错误 如果全部输入正确,则跳转到主页success.jsp,显示:用户名,欢迎您思路 在生成验证码的时候将它的值存入到session中,在比对的时候再取出来进行对比 代码index.jsp <%-- Created by IntelliJ IDEA. User: tanglei Date: 2020/6/26 Time: 下午12:48 To ch
-
Json字符串转Java对象和List代码实例
对象POJO和JSON互转 public class JsonUtil { /** * JSON 转 POJO */ public static <T> T getObject(String pojo, Class<T> tclass) { try { return JSONObject.parseObject(pojo, tclass); } catch (Exception e) { log.error(tclass + "转 JSON 失败"); } re
-
Java ArrayList遍历修改代码实例解析
用for-each 边遍历ArrayList 边修改时: public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("aa"); list.add("bb"); list.add("cc"); list.add("dd"); System.out.println(list);
-
Java 代码实例解析设计模式之监听者模式
代码展示 Main:测试类 ObServer:每个被监听的对象实现该接口,重写该方法,完成自己的业务 public interface ObServer { /** * 当某一个被监控的对象发生变化时 * 所有实现该方法处理方法 */ void exceptionHandler(); } Subject:监听者容器 public interface Subject { /** * 添加被观察对象 */ void add(ObServer obServer); /** * 通知所有被观察者完成自己
随机推荐
- asp.net批量多选文件上传解决方案
- php操作xml并将其插入数据库的实现方法
- 用Javascript读取中文COOKIE的解决办法
- Docker的boot2docker.iso镜像使用
- nodejs开发微博实例
- PHP Curl出现403错误的解决办法
- shell中1小于/dev/null 2大于&1的含义
- Linux命令学习总结:详解shutdown命令
- python创建只读属性对象的方法(ReadOnlyObject)
- macOS Sierra安装Apache2.4+PHP7.0+MySQL5.7.16
- jquery easyui combobox模糊过滤(示例代码)
- Easyui笔记2:实现datagrid多行删除的示例代码
- jQuery 操作option的实现代码
- Python实现在matplotlib中两个坐标轴之间画一条直线光标的方法
- ThinkPHP的URL重写问题
- android的RecyclerView实现拖拽排序和侧滑删除示例
- Android绘制圆形百分比加载圈效果
- 基于PyQt4和PySide实现输入对话框效果
- 微信小程序左滑删除实现代码实例
- Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】