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

 更新时间:2022年04月26日 15:03:41   作者:星鸦wyk  
在类中没有包含足够的信息来描绘一个具体的对象,这样的类称为抽象类,接口是Java中最重要的概念之一,它可以被理解为一种特殊的类,不同的是接口的成员没有执行体,是由全局常量和公共的抽象方法所组成,本文给大家介绍Java抽象类和接口,感兴趣的朋友一起看看吧

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

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

1.对象的比较

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

1.1 Comparable<T>

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

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

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

1.2 Comparator<T>

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

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

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

2.克隆对象

2.1 Cloneable

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

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

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方法中将其实例化后克隆给另一个对象,看看结果:

此时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 +
                '}';
    }
}

 结果如下:

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

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

 类A修改后的内存如下:

按照上图来看,要实现深拷贝就需要把类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 +
                '}';
    }
}

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

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抽象类与接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Mvc中CommonsMultipartFile的特性实例详解

    Spring Mvc中CommonsMultipartFile的特性实例详解

    这篇文章主要给大家介绍了关于Spring Mvc中CommonsMultipartFile特性的相关资料,SpringMVC拥有强大的灵活性,非侵入性和可配置性,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • java.lang.ExceptionInInitializerError初始化程序中的异常错误的解决

    java.lang.ExceptionInInitializerError初始化程序中的异常错误的解决

    java.lang.ExceptionInInitializerError 异常在 Java 中表示一个错误,该错误发生在尝试初始化一个类的静态变量、静态代码块或枚举常量时,本文就来介绍并解决一下,感兴趣的可以了解一下
    2024-05-05
  • 使用Java和WebSocket实现网页聊天室实例代码

    使用Java和WebSocket实现网页聊天室实例代码

    WebSocket是HTML5一种新的协议,它实现了浏览器与服务器全双工通信,这里就将使用WebSocket来开发网页聊天室,对Java和WebSocket实现网页聊天室的实例代码感兴趣的朋友一起学习吧
    2016-06-06
  • MyBatis-Plus分页时排序的实现方法

    MyBatis-Plus分页时排序的实现方法

    这篇文章主要介绍了MyBatis-Plus分页时的排序,分页时排序的方法,后端OrderItems排序、Wrapper排序前端指定排序,文章结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • java版微信公众平台后台接入

    java版微信公众平台后台接入

    这篇文章主要为大家详细介绍了java版微信公众平台后台接入,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • JAVA设置手动提交事务,回滚事务,提交事务的操作

    JAVA设置手动提交事务,回滚事务,提交事务的操作

    这篇文章主要介绍了JAVA设置手动提交事务,回滚事务,提交事务的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • 关于Android触摸事件分发的原理详析

    关于Android触摸事件分发的原理详析

    触摸事件分发机制一直以来都是Android中比较重要的一大块,自定义view,各种复杂的自定义手势交互都与触摸事件分发机制关系密,下面这篇文章主要给大家介绍了关于Android触摸事件分发原理的相关资料,需要的朋友可以参考下
    2022-01-01
  • Java中自己如何实现log2(N)

    Java中自己如何实现log2(N)

    这篇文章主要介绍了Java中自己实现log2(N)的方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • idea如何自动添加版权许可证信息

    idea如何自动添加版权许可证信息

    这篇文章主要介绍了idea如何自动添加版权许可证信息问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Spring-cloud 服务发现与消费(以ribbon为例)

    Spring-cloud 服务发现与消费(以ribbon为例)

    这篇文章主要介绍了Spring-cloud 服务发现与消费(以ribbon为例),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04

最新评论