重写comparable接口compareto方法_愉快地学Java语言:第十章:抽象类和接口

导读

本文适合Java入门,不太适合Java中高级软件工程师。本文以《Java程序设计基础篇》第10版为蓝本,采用不断提出问题,然后解答问题的方式来讲述。本篇文章只是这个系列中的一篇,如果你喜欢这种讲解方式,或者觉得从中能学到知识,可以关注我,以便查阅本系列其他文章。

让我们开始愉快地学习Java语言吧!

1抽象类

定义:

抽象类:没有具体实现,无法使用new实例化,并且使用abstract修饰的类。

抽象方法:抽象方法只有方法头,没有具体的实现。抽象方法使用abstract修饰。

要点:

  • 抽象类虽然不能实例化,但可以作为类型使用。
  • 抽象类也可以包含实例方法。
  • 父类是具体的,其子类可以是抽象类。
  • 抽象类的构造方法必须使用protected修饰。
  • 一个包含抽象方法的类必须声明为抽象类。
  • 非抽象类不能有抽象方法。
  • 子类中重写方法可以定义为abstract。

为什么要设计抽象类?

在使用继承建模的过程中,父类具备所有子类共有的特性,这时父类就成了一种契约,约束子类共有的特性。使用抽象类可以实现这种效果。

为什么抽象类的构造方法必须使用protected?

因为抽象类是一种契约,它是仅供其子类使用。

例如:

425d598e3eec4636327bf0f354c711b8.png
54b242f4a770e6202b29a79abae27901.png
822a7dc2a35377a810cbed527ae0b255.png

2接口

语法:

修饰符 interface 接口名 {

//常量

//抽象方法

}

要点:

  • 被看做一种特殊的类,每个接口都被编译为独立的字节码文件。
  • 只包含常量和抽象方法。
  • 不能使用new操作符创建接口的实例。
  • 接口继承:用来描述类与接口之间的继承关系。
  • 接口中的数据域都被public static final修饰,所以可将这几个修饰符省略。
  • 接口中的方法都被public static修饰,所以可将这几个修饰符省略。
  • 使用implements实现接口。
  • 一个类在继承另一个类的同时可以实现接口。
  • 一个类可以实现多个接口,但只能继承一个抽象类
  • 接口可以继承其他接口,称之为子接口,被继承的接口称之为父接口。
  • 接口没有根接口,但类有共同的根类Object。
  • 一个接口类型的变量可以引用任何实现该接口的类的实例。

看一个简单的例子,下面在类B中实现接口Iface,它的两个抽象方法这里没有给出具体实现。

680d827ed57a265975606fd85b95e652.png
348949c0b997f9ef2f63a7e497d388df.png
5e94720ac027a03aadc9d9a9314a1395.png

3 Comparable

比较两个对象的大小,一般是指比较两个对象数据域的大小,这种情况下,数据域是数值型,字符串类型,或者是日期。

Comparable定义如下,它是个泛型接口,它只定义了一个compareTo方法。

public interface Comparable {

public int compareTo(T o);

}

当在自己的类总重写Comparable的compareTo方法时,注意还有一个继承来的equals方法,尽量保持compareTo方法与equals方法一致,即compareTo返回值为0,equals返回值为true。

JDK的API中好多类都实现了这个接口,让我们看一个例子:

下图中可以看出,Long的父类是Number,同时实现了Comparable接口

3062ce1a3e0eb9af005314d2f8eb791d.png

下面是重写的compareTo方法,具体实现是调用了compare方法。

76fb94f9898d249d3dd0edfc5981fc23.png

下面是compare方法的实现:

092e4540bacd5db6d8506f9cb95168c8.png

4Cloneable接口

使用Cloneable定义一个对象可以被拷贝。

来看下Cloneable的定义:

a59bf5760ef9ecad116a268b2301639c.png

你会发现,什么都没有,我们称这样的一个带空体的接口为标记接口。

如果一个类实现了Cloneable接口,那么它必须重写Object的clone()方法。

让我们看看JDK API中Date类如何实现Cloneable即重写clone()的。

下面Date实现了三个接口java.io.Serializable, Cloneable, Comparable

bf20299baf5e8f590dd4ed0c3be0f9c2.png

先声明一个Date类型的变量d,然后调用Object的clone方法,将其返回值赋给d,然后调用sun.util.calendar.BaseCalendar的clone方法复制对象,最后返回对象d。

69fca9eaace041077a6926d8032208d6.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值