Java JDK内置常用接口和深浅拷贝

目录
  • 前言
  • 一、comparable接口
  • 二、Cloneable接口
  • 三、深浅拷贝
    • 1.浅拷贝
    • 2.深拷贝

前言

在Java中,我们使用接口优先原则,当一个场景可以使用抽象类也可以使用接口定义时,优先考虑使用接口,因为接口更灵活,使用抽象类必须满足is a 的继承树关系,而且是单继承,接口相比于抽象类更加的灵活,本篇我们就一起看看JDK中的常用内置接口。

一、comparable接口

java.lang.Comperable:

当一个类实现了Comperable接口,就表示该类具备了可比较的能力!

此时定义了一个Person类型的数组:

由于Person这个类型是自定义的类型,对于编译器来说,不像int类型一样大小关系一目了然;
对于编译器来说,到底哪个Person对象大,哪个Person对象小,编译器就无从得知了,此时就要让Person这个类型具备可比较的能力,也就是要让JDK知道Person对象“谁大谁小”,就需要让Person这个类实现Comperable接口,覆写抽象方法compereTo。
此时覆写的方法返回值是int,传入的参数是任意类型,因为不知道要比较的是什么类型

int返回值 >0 =0 <0 表示当前对象this > 传入对象o 表示当前对象this = 传入对象o 表示当前对象this < 传入对象o

覆写comperTo方法:

当Person类实现了Comperable接口,覆写了compereTo方法之后,就可以把Person 类的对象进行大小排序了,可以按年龄大小进行比较,也可以按照姓名大小比较

此时是默认按照年龄的升序排序的,如果想要按照年龄的降序排序,该怎么办?该如何调整compereTo方法呢?

此时只需要将返回值取反,让传入的年龄减去当前对象的年龄,让JDK误认为年龄越小的反而越“大”。

二、Cloneable接口

java.lang.Cloneable

首先了解一下什么是克隆,就是原对象和新产生对象是两个独立的对象,新产生的对象是通过原对象“拷贝”而来的,属性值和原对象完全一致。
要想让一个类具备可复制的能力,就让该类实现Cloneable接口,覆写clone方法

这里Animal实现了Cloneable接口,但是没有覆写任何方法,但是这里没有报错,这是因为Cloneable接口里本来什么都没有,但是这并不是一个空接口

类似Cloneable接口,把这种接口称之为“标记”接口,这个接口本身内部没有任何抽象方法,只有打上这个“标记”的子类才具备可克隆的能力
JVM在运行时会检查所有实现了Cloneable接口的子类,然后赋予其可以克隆的能力
就像现在的一码通,根据一码通的颜色,把不同的人划分为不同的类,只有检测为绿码的人,才能通过。

animal1 是通过 animal 克隆来的,但是此时使用“ == ”比较他们两个的地址返回的还是false,说明克隆是产生了新的对象,只是新对象和原来的对象的属性值完全相同
此时在产生一个对象animal2

Animal animal2 = new Animal();
animal1和animal2的区别:
animal1是依赖于animal产生的;
animal2的产生和animal完全没有任何关系。

调用clone方法产生的对象不会调用构造方法:

在Java中产生对象一共有两种方式:

  • 1.最普遍的通过构造方法产生对象,当有new关键字,就在堆上开辟该类相应属性的空间,给属性赋默认值。
  • 2.通过clone()产生对象,调用clone方法时,JVM会开辟与原对象内存大小完全相同的新空间,并将对象的属性值从原对象中复制一份(不推荐,Java都不推荐使用这种方式产生对象)

三、深浅拷贝

1.浅拷贝

克隆对象和原对象的确是两个独立的对象,
但是b1和b2的对象内部包含了其他的引用,克隆后的b2包含的其他引用并没有产生新的对象,b1.a 和 b2.a指向相同的A对象。

2.深拷贝

深拷贝就是克隆对象内部包含的其他引用,也产生了新的对象
b1.a 和 b2.a指向不同的A对象。

Java中深拷贝的实现方式:

  • 1.递归的使用clone方法
  • 2.序列化(json字符串)

到此这篇关于Java JDK内置常用接口和深浅拷贝的文章就介绍到这了,更多相关Java JDK内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 解决IDEA JDK9没有module-info.java的问题

    目录 IDEA JDK9没有module-info.java问题 module-info.java文件 IDEA JDK9没有module-info.java问题 1. 创建一个maven工程 2. 配置一下项目的编译环境 注意:必须声明为jdk9及其以后的版本,不然new中是没有module-info.java这个选项 下面是使用jdk8的时候,没有module-info.java这个选项 使用jdk10的时候,就有module-info.java这个选项 <build> <plugi

  • 教你用JDK编译Java文件的方法

    1.下载并安装好JDK百度网盘链接: 链接: https://pan.baidu.com/s/1j_TSvjHgw3jEBGaMk0LQ8w?pwd=pdp9 提取码: pdp9 2.设置环境变量 第一步:将JDK的安装路径bin进行复制,如:D:\Java\jdk1.8.0_221\bin 第二步:在高级选项卡中,点击环境变量按钮---->在系统变量中找Path---->选中Path点击编辑---->点击新建---->按Ctrl+V---->确定 3:打开记事本编写Java

  • Java中的OpenJDK使用原理

    目录 Java和OpenJDK的特殊之处是什么? OpenJDK是如何产生的 OpenJDK的工作原理和优点是什么 Java语言与体系结构无关,JVM是可移植的 Java很简单,面向对象,大家都很熟悉 Java是健壮和安全的 Java是高性能的 OpenJDK是如何开发的 OpenJDK作为太空竞赛的基础 OpenJDK的升级过程 错误修复 新功能的实施和过时功能的弃用 主要分支机构以外的项目 规范变更 释放节奏 为什么开源优于闭源 为什么有那么多OpenJDK供应商和实现? 结论 前言: Op

  • 2021最新Java JDK1.8的安装超详细教程

    目录 一.JDK下载 1.官网下载 2.网盘下载 二.安装步骤 1.开始安装: 2.修改默认目录,点击下一步. 3.会提示安装jre,同样修改默认目录,新建目录名如图: 4.继续点击下一步,点击关闭,完成安装. 三.搭配环境变量 1.Path变量 jdk1.8又称jdk8.0,是目前相对比较稳定的版本,不建议下载最新的jdk版本,因为最新版的jdk不稳定,在Java的学习中可能会出现各种各样的问题. 一.JDK下载 1.官网下载 点击官网下载地址往下划,找到自己电脑相对应的JDK,点击下载. 如

  • Java9版本新特性同一个Jar支持多JDK版本运行

    目录 一.基本使用方法 二.真实的例子 java8代码 Java9代码 编译 运行Mainclass 我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 写成一系列的文章,大概十篇左右. java9第一篇-可以在interface中定义私有方法了java9第二篇-Java9改进try-with-resources语法 本文内容:在Java 9增强了J

  • Tomcat 8.5 +mysql 5.7+jdk1.8开发JavaSE的金牌榜小项目

    目录 注册登录 注册 登录 留言板模块 留言板 热搜榜 查询&&搜索 增删改查 环境:Tomcat 8.5 +mysql 5.7+jdk1.8 这个作业是我们Java课程的考核项目,想在把分享给大家.菜鸟在启航 MVC+servlet+jsp+mysql 不废话,下面就来看看这个项目 注册登录 注册 package com.bjpowernode.javaweb.servlet; import com.bjpowernode.javaweb.utils.DButil; import jav

  • Java16 JDK安装并设置环境变量的方法步骤

    本文将在win10的环境下安装jdk16.配置环境变量. 1.下载JDK (1)打开官网下载最新的JDK(Java SE Development Kit, JDK) 如果官网打开过慢可以试试本地下载:下载地址 (2)选择对应的版本 (3)双击下载的exe进行安装 在安装过程中可以改变安装位置也可以不改变,但是安装的位置一定要记住!!!!这关系到后面设置环境变量.然后安装过程中其它的选项就next~ (4)配置环境变量 一共需要配置3个系统环境变量. 此电脑–属性–高级系统设置–环境变量-新建系统

  • java底层JDK Logging日志模块处理细节深入分析

    日志输出是所有系统必备的,很多开发人员可能因为常常使用log4j而忽视了JDK logging模块,两者之间是否有联系?是怎样的联系?JDK logging处理细节是怎么样的?本周抛砖引玉,先分析JDK logging机制. 从例子开始 JDK Logging的使用很简单,如下代码所示,先使用Logger类的静态方法getLogger就可以获取到一个logger,然后在任何地方都可以通过获取到的logger进行日志输入.比如类似logger.info("Main running.")的

  • 详解java接口(interface)在不同JDK版本中的变化

    JDK1.7以及以前: 接口(interface)在JDK7及之前的版本对接口的要求: 接口定义: 使用 interface 关键字 . 接口中的 所有 成员变量 都默认是由 public static final 修饰的. 接口中的 所有方法 都默认是由 public abstract 修饰的.也可以使用 protected ,但不能用 private . 接口中的 所有方法 都没有方法体. 接口没有构造方法.因为构造方法用于创建对象. 实现接口的类 必须提供接口中所有方法的具体实现内容. 可

  • 关于java中多个JDK和切换版本介绍

    目录 前言 一.下载安装JDK 二.配置JDK 总结 前言 安装多个JDK并随时切换版本 一.下载安装JDK 我这里采用JDK8和JDK11两个版本进行示范官网下载:https://www.oracle.com/java/technologies/downloads/下载之后进行安装即可 二.配置JDK 1.系统变量 在系统变量中新建变量,变量名JAVA_HOME,JAVA_HOME11,JAVA_HOME8如图所示: 这里JAVA_HOME11,JAVA_HOME8的变量值是你安装JDK8或J

随机推荐