Java由浅入深通关抽象类与接口(下篇)


Posted in Java/Android onApril 26, 2022

本篇介绍在对对象进行比较和克隆操作的时候会使用的接口,然后介绍一个类:Object

在Java中Object类默认是所有类的父类,里面有一些常用的方法会介绍

1.对象的比较

两个对象要进行比较之前,我们首先需要确定依据什么来进行比较,对象中的成员变量那么多,直接比较是无法比较的

1.1 Comparable<T>

<T>是接口的参数,里面填要比较的对象的类型

此接口里面只有一个compareTo抽象方法,结构如下:

Java由浅入深通关抽象类与接口(下篇)

在类中实现此接口后就可以进行类和类之间的大小的比较

1.2 Comparator<T>

这个接口中有一个抽象方法compare,同样是用来实现对象之间比较大小,方法的结构如下:

Java由浅入深通关抽象类与接口(下篇)

Java由浅入深通关抽象类与接口(下篇)

和Comparable<T>接口所不同的是,Comparator<T>接口可以作为Arrays类中sort方法的参数

Java由浅入深通关抽象类与接口(下篇)

如果是元素为类的数组,使用Comparator<T>接口可以进一步进行数组排序

2.克隆对象

2.1 Cloneable

这个接口是一个空接口,但类需要实现此接口才能被克隆,而要重写的方法则是Object类中的clone()方法

在IDEA中自动重写的clone()方法如下:

Java由浅入深通关抽象类与接口(下篇)

throws以及后面的语句不是现在的重点,暂时略过

因为此方法的返回值是Object类,所以在使用的时候记得结果强制类型转换成子类 

2.2 深拷贝和浅拷贝

既然说到克隆,那就不得不提深拷贝和浅拷贝,简单说下二者的概念:

假设将A的内容拷贝到B中,然后我们修改B中的内容,如果A的内容没有改变,那么就是深拷贝,否则就是浅拷贝

需要说明的是:一个克隆方法是深拷贝还是浅拷贝和类里面的成员变量以及自己写的代码都有关系,两个不同的类使用同一个克隆方法,一个是深拷贝,另一个是浅拷贝,这种情况是存在的

现在有一个类如下:

class A implements Cloneable{
    int i;
    int j;
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
    @Override
    public String toString() {
        return "{" +
                "i=" + i +
                ", j=" + j +
                '}';
    }
}

我们在main方法中将其实例化后克隆给另一个对象,看看结果:

Java由浅入深通关抽象类与接口(下篇)

此时a并没有因为b的改变而改变,clone()为深拷贝

我们再将类A进行改造:

class B implements Cloneable {
    int k;
}
class A implements Cloneable{
    int i;
    int j;
    B c=new B();
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
    @Override
    public String toString() {
        return "{" +
                "i=" + i +
                ", j=" + j +
                ", c.k=" + c.k +
                '}';
    }
}

 结果如下:

Java由浅入深通关抽象类与接口(下篇)

那么此时clone是深拷贝还是浅拷贝?

出现这种结果的原因要从内存上看,在类A没有进行修改之前内存如下:

Java由浅入深通关抽象类与接口(下篇)

 类A修改后的内存如下:

Java由浅入深通关抽象类与接口(下篇)

按照上图来看,要实现深拷贝就需要把类B的内容再克隆一份,所以我们需要对clone方法进行修改

class B implements Cloneable {
    int k;
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
class A implements Cloneable{
    int i;
    int j;
    B c=new B();
    @Override
    protected Object clone() throws CloneNotSupportedException {
        A tmp=(A)super.clone(); 
        tmp.c=(B)this.c.clone();
        return tmp;
    }
    @Override
    public String toString() {
        return "{" +
                "i=" + i +
                ", j=" + j +
                ", c.k=" + c.k +
                '}';
    }
}

Java由浅入深通关抽象类与接口(下篇)

至于为什么自己画图试试 ,这里就不讲了

3.Object类

Object类中有一些常用的方法这里拿出来介绍

3.1 equals

在Object类中此方法是用来比较大小的,返回值是布尔值,底层的实现逻辑如下:

public boolean equals(Object obj) {
    return (this == obj); 
}

关于“==”,如果两边的变量是基本类型的变量,比较的是值是否相同,而如果是引用类型的变量的话,比较的则是地址是否相同

3.2 toString

输出语句System.out.println()底层调用的就是toString方法,不过如果输出的是引用类型数据默认是输出修改后的地址,所以此时需要对其进行重写,这也是上面的例子中有toString方法的原因

本篇结束,完

到此这篇关于Java由浅入深通关抽象类与接口下的文章就介绍到这了!

Java/Android 相关文章推荐
教你用Java Swing实现自助取款机系统
Jun 11 Java/Android
springboot中一些比较常用的注解总结
Jun 11 Java/Android
springBoot基于webSocket实现扫码登录
Jun 22 Java/Android
分析JVM源码之Thread.interrupt系统级别线程打断
Jun 29 Java/Android
spring boot项目application.properties文件存放及使用介绍
Jun 30 Java/Android
java协程框架quasar和kotlin中的协程对比分析
Feb 24 Java/Android
Java生成日期时间存入Mysql数据库的实现方法
Mar 03 Java/Android
springboot用户数据修改的详细实现
Apr 06 Java/Android
Java 使用类型为Object的变量指向任意类型的对象
Apr 13 Java/Android
Java 数组的使用
May 11 Java/Android
Spring 使用注解开发
May 20 Java/Android
spring 项目实现限流方法示例
Jul 15 Java/Android
Java由浅入深通关抽象类与接口(上篇)
Mybatis-Plus 使用 @TableField 自动填充日期
Apr 26 #Java/Android
Java 写一个简单的图书管理系统
Apr 26 #Java/Android
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
Apr 24 #Java/Android
Spring Boot 使用 Spring-Retry 进行重试框架
Apr 24 #Java/Android
Android在Sqlite3中的应用及多线程使用数据库的建议
Apr 24 #Java/Android
Android开发 使用文件储存的方式保存QQ密码
Apr 24 #Java/Android
You might like
php中使用redis队列操作实例代码
2013/02/07 PHP
基于Laravel实现的用户动态模块开发
2017/09/21 PHP
Discuz不使用插件实现简单的打赏功能
2019/03/21 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
2020/02/27 PHP
Yii 框架使用数据库(databases)的方法示例
2020/05/19 PHP
jquery pagination插件实现无刷新分页代码
2009/10/13 Javascript
[原创]js获取数组任意个不重复的随机数组元素
2010/03/15 Javascript
myFocus slide3D v1.1.0 使用方法与下载
2011/01/12 Javascript
关于js datetime的那点事
2011/11/15 Javascript
鼠标移入移出事件改变图片的分辨率的两种方法
2013/12/17 Javascript
谈谈PHP中相对路径的问题与绝对路径的使用
2016/08/16 Javascript
Angular设置title信息解决SEO方面存在问题
2016/08/19 Javascript
Bootstrap在线电子商务网站实战项目5
2016/10/14 Javascript
Javascript使用function创建类的两种方法(推荐)
2016/11/19 Javascript
JS定时器实现数值从0到10来回变化
2016/12/09 Javascript
ztree简介_动力节点Java学院整理
2017/07/19 Javascript
ionic2屏幕适配实现适配手机、平板等设备的示例代码
2017/08/11 Javascript
WebStorm ES6 语法支持设置&amp;babel使用及自动编译(详解)
2017/09/08 Javascript
HTML5+JS+JQuery+ECharts实现异步加载问题
2017/12/16 jQuery
详解vue移动端日期选择组件
2018/02/22 Javascript
vue使用svg文件补充-svg放大缩小操作(使用d3.js)
2020/09/22 Javascript
[48:48]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python函数式编程指南(二):从函数开始
2015/06/24 Python
Python实现PS滤镜的万花筒效果示例
2018/01/23 Python
Python模拟随机游走图形效果示例
2018/02/06 Python
python 实现从高分辨图像上抠取图像块
2020/01/02 Python
Pycharm 跳转回之前所在页面的操作
2021/02/05 Python
Python的轻量级ORM框架peewee使用教程
2021/02/05 Python
澳大利亚现代波西米亚风格女装网站:Bohemian Traders
2018/04/16 全球购物
俄罗斯美容和健康网上商店:Созвездие Красоты
2019/07/23 全球购物
英国领先的男装设计师服装独立零售商:Repertoire Fashion
2020/10/19 全球购物
如何写出高性能的JSP和Servlet
2013/01/22 面试题
职高毕业生自我鉴定
2013/10/21 职场文书
公司财务总监岗位职责
2013/12/14 职场文书
乳制品整治工作方案
2014/05/29 职场文书
敬老院活动感想
2015/08/07 职场文书