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

目录
  • 1.对象的比较
    • 1.1 Comparable<T>
    • 1.2 Comparator<T>
  • 2.克隆对象
    • 2.1 Cloneable
    • 2.2 深拷贝和浅拷贝
  • 3.Object类
    • 3.1 equals
    • 3.2 toString

本篇介绍在对对象进行比较和克隆操作的时候会使用的接口,然后介绍一个类: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抽象类与接口内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java 深入浅出解析面向对象之抽象类和接口

    目录 抽象类 声明抽象类 声明抽象方法 案例 使用规则 接口 声明接口 案例 接口特性 抽象类和接口的区别 抽象类 java语言,声明类时 abstract class Db{} 说明Db类为抽象类. java语言中,抽象方法是说没有方法的实现(方法体)此方法为抽象方法,只有抽象类和接口中才可以有抽象方法. 声明抽象类 声明抽象类很简单,加个abstract关节字就行. public abstract class AA { } 声明抽象方法 在抽象类中声明一个抽象方法,抽象方法没有方法体,就是说

  • Java详细讲解不同版本的接口语法和抽象类与接口的区别

    目录 什么是接口? 接口的语法: (JDK7.0) 接口的语法: (JDK8.0) 接口的语法: (JDK9.0)—(私有方法) 接口的分类 常量接口: 空接口: 函数式接口: 什么是接口? 说到接口,USB大家肯定不陌生~接口是一种标准.规范.注意:接口一旦制定好,使用者和实现者都必须遵循的标准. 接口的语法: (JDK7.0) (1) 关键字:interface (2) 语法:  interface 接口名{} (3) 接口编译之后会生成对应的 .class文件 (4) 接口不能创建对象,但

  • 一起来了解Java的态和抽象类

    目录 多态: 抽象类: 总结 多态: 我们知道Java的三大特性:封装.继承.多态.前两个之前在Java入门(六)已经讲到,现在来讲多态这个特性. 什么是多态? 多态顾名思义即为多种形态的意思 Java中多态的含义: 1.发送消息给某个对象,让这个对象自行决定采用哪种行为响应这个消息 2.子类对象的引用赋值给父类引用变量来实现动态的方法调用 Java中形成多态的前提: 1.继承 2.父类方法的重写 3.向上转型 我对多态的解释: 比如我们,是人,也是学生,也是年轻人,我可以用人的身份去做事情,也

  • 解析JavaSe的抽象类和接口

    目录 1. 抽象类和抽象方法 2. 相关面试题 1.抽象类必须要有抽象方法吗? 2.普通类和抽象类有哪些区别? 3.抽象类能使用 final 修饰吗? 3. 接口 3.1 接口中的常量 3.2 接口中的方法 3.2.1 接口中的普通方法 3.2.2 接口中的静态方法 3.2.3 接口中的默认方法 3.3 接口中的接口和枚举类 3.4 接口和抽象类 总结 1. 抽象类和抽象方法 抽象方法和抽象类必须使用abstract修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类里可以没有抽象方法.抽象方

  • Java十分钟精通多态与抽象类的使用与原理

    我们知道Java的三大特性:封装.继承.多态.前两个之前在Java入门(六)已经讲到,现在来讲多态这个特性. 什么是多态? 多态顾名思义即为多种形态的意思 Java中多态的含义: 发送消息给某个对象,让这个对象自行决定采用哪种行为响应这个消息 子类对象的引用赋值给父类引用变量来实现动态的方法调用 Java中形成多态的前提: 继承 父类方法的重写 向上转型 我对多态的解释: 比如我们,是人,也是学生,也是年轻人,我可以用人的身份去做事情,也可以用学生的身份去买学生票,也可以用年轻人的身份做公益,这

  • Java 超详细讲解抽象类与接口的使用

    目录 一.抽象类 1.抽象类的语法 2.抽象类的特性 3.抽象类的作用 二.接口 1.接口的概念 2.接口使用 3.接口特性 4.实现多个接口 5.接口间的继承 6.常用的接口 (1)Comparable接口 (2)Cloneable接口 三.Object类 一.抽象类 在Java中,如果一个类被abstract修饰称为抽象类,抽象类中被abstract修饰的方法称为抽象方法,抽象方法不用给出方法体. 1.抽象类的语法 //抽象类:被abstract修饰的类 public abstract cl

  • 一文搞懂Java中的抽象类和接口到底是什么

    目录 什么是抽象类 抽象类在实现多态中的意义 接口是什么 通过接口实现多态

  • Java超详细分析抽象类和接口的使用

    目录 什么是抽象类 抽象类语法 总结抽象类: 接口 怎么定义接口 接口间的继承 几个重要的接口 接口comparable comparator接口-比较器 cloneable接口深入理解深拷贝与浅拷贝 怎么使用cloneable接口 浅拷贝: 深拷贝 什么是抽象类 什么是抽象类呢?抽象类顾名思义就是很抽象,就是当我们没有足够的信息去描述这个类的时候我们就可以先不用描述,这样的类就是抽象类. 用代码举个例子: class Shape { public void draw() { System.ou

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

    目录 1.对象的比较 1.1 Comparable<T> 1.2 Comparator<T> 2.克隆对象 2.1 Cloneable 2.2 深拷贝和浅拷贝 3.Object类 3.1 equals 3.2 toString 本篇介绍在对对象进行比较和克隆操作的时候会使用的接口,然后介绍一个类:Object 在Java中Object类默认是所有类的父类,里面有一些常用的方法会介绍 1.对象的比较 两个对象要进行比较之前,我们首先需要确定依据什么来进行比较,对象中的成员变量那么多,

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

    目录 1.抽象类 1.1抽象类概念 1.2抽象方法 1.3抽象类的细节 2.接口 2.1接口概念 2.2接口的细节 1.抽象类 1.1抽象类概念 我们都知道对象是通过类来进行描述的,但是不是说所有的类都是用来描述对象的 一个类的类中没有足够的信息来描述一个具体的对象,这便是抽象类 抽象类的关键字:abstract 1.2抽象方法 首先还是看看之前写过的类: class Plant { String name; String source; String genus; public void tr

  • Java中比较抽象类与接口的异同

    目录 一.抽象类 (一)概念 (二)抽象类和抽象方法 (三)使用抽象类的意义 二.接口 (一)概念 (二)语法 三.比较抽象类与接口 Q: 为什么有了抽象类还要接口?  Q: 如何确定在什么情况下应该使用接口,什么情况下应该使用类呢? 一.抽象类 (一)概念       在继承的层次结构中,每个新的子类都使类变得更加明确和具体.如果从一个子类向父类追溯,类就会变得更通用.更加不明确.类的设计应该确保父类包含它的子类的共同特征.有时候,一个父类设计得非常抽象,以至于它都没有任何具体的实例.这样的类

  • java中的抽象类和接口定义与用法详解

    目录 一.抽象类 1.什么叫抽象类? 2.抽象类的特点: 3.成员特点: 二.接口 1.接口是什么? 2.接口的特点 3.接口的组成成员 4.类与抽象的关系: 5.抽象类与接口的区别: 一.抽象类 1.什么叫抽象类? 例如在生活中我们都把狗和猫归为动物着一类中,但当只说动物时,我们是不知道是猫还是狗还是其他的.所以动物就是所谓的抽象类,猫和狗则是具体的类了.因此在Java中,一个没有方法体的方法应该定义为抽象类,而类中有抽象方法,则必须为抽象类. 2.抽象类的特点: 抽象类与抽象方法必须用abs

  • Java基础巩固抽象类与接口详解

    目录 1.抽象类 1.1.什么是抽象类 1.2.抽象类的用法 1.3.抽象类特点(限制条件) 2.接口 2.1.什么是接口 2.2.接口的用法 2.3.如何使用接口 2.4.接口的特点(限制条件) 2.5.如何实现多个接口 2.6.接口于接口之间的继承关系 2.7.如何使用接口 抽象类与接口 1.抽象类 1.1.什么是抽象类 如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类 1.2.抽象类的用法 一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract

  • Java中的抽象类和接口你了解吗

    目录 抽象类 什么是抽象类? 抽象类属于什么类型? 抽象类怎么定义? 抽象类是干什么的? 什么是抽象方法? 非抽象类继承抽象类 抽象类总结 接口 接口的基础语法 接口的实现 接口和多态联合使用 继承和实现同时出现 接口在开发中的作用 类型和类型之间的关系 总结 抽象类 什么是抽象类? 类和类之间有共同特征,将这些共同特征提取出来进一步抽象,就形成了抽象类.由于类是不存在的,所以抽象类无法创建对象. 抽象类属于什么类型? 抽象类也属于引用数据类型. 抽象类怎么定义? [修饰符列表] abstrac

  • Java动态获取实现某个接口下所有的实现类对象集合

    最近有个需求,我需要获取所有同一类型的定时任务的对象,并自动执行. 我想的方案是:直接获取某个接口下面所有的实现类的对象集合,方便以后只需要 实现这个接口,就能自动被加载执行.话不多说,说说我的实现方案. 开始想着用反射自己写一个工具类,后面懒得去折腾,就直接用第三方工具包了,这里我用的是org.reflections. maven配置: <dependency> <groupId>org.reflections</groupId> <artifactId>

  • Java面向对象基础之多态性,抽象类和接口

    一.多态性 多态是指一个对象可以拥有多种不同的形态,继承是实现多态的基础. 1.1 引用多态和方法多态 引用多态:父类引用可以指向本类的对象,也可以指向子类的对象 方法多态: 1.创建本类对象时,调用的方法为本类方法: 2.创建子类对象时,调用的方法为子类重写或继承的方法. 首先建立父类Animal,包含一个eat()方法,如下代码所示: public class Animal { public void eat(){ System.out.println("动物可以吃东西"); }

  • 深入理解JAVA抽象类和接口的比较与异同

    目录 一.理解抽象类 二.从语法定义层面看抽象类和接口 三.从编程的角度看抽象类和接口 四.从设计理念层面看抽象类和接口 五.总结 抽象类(abstract class)和接口(interface)是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力.抽象类和接口之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于抽象类和接口的选择显得比较随意.其实,两者之间还是有很大的区别的,对于它们的

随机推荐