Compareable接口的使用问题,以及对接口的深入了解

当一个类没有调用此类的方法,如何实现了这些功能的呢?

先看下面这个代码:

import java.util.*;

public class TreeSetDemo {
public static void main(String args[]){
Set<Person> allSet = new TreeSet<Person>();
allSet.add(new Person("张三",20));
allSet.add(new Person("张四",21));
allSet.add(new Person("张五",19));
allSet.add(new Person("张六",21));
allSet.add(new Person("张七",18));
allSet.add(new Person("张八",30));
System.out.println(allSet);
}
}
class Person implements Comparable<Person>{
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}


@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}


public int compareTo(Person per){
if (this.age>per.age){
return 1;

}
else if (this.age<per.age){
return -1;
}
else 
return 0;
}

}


为什么不用调用compareTo方法就可以直接实现对象的有序化?

下面是对Comparable接口官方文档的说明:

public interface Comparable<T>
 

此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo 方法被称为它的自然比较方法

实现此接口的对象列表(和数组)可以通过 Collections.sort(和Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器


Compareable接口是自带有实现对象有序化的特征的(这个是别人在设计此接口就已经底层实现好了的),只要用户继承此接口,并实现自己的compareTo方法,就会自动实现对象有序化。

拿jdk中某些类和接口来说,比如Object类,它是所有类的父类,因为设计者在设计这个类的时候,就已经编写好了一些逻辑,比如:在输出一个对象的时候,就会默认调用这个对象的toString方法。再比如在调用List对象的时候,为什么list对象是一个集合?因为List继承Collection接口,collection在设计的时候,就具有集合的属性。

所以,当一个类没有调用此类的方法,而实现了某些功能的时候,那是其父类或者继承的接口,自动帮助实现的。

为什么要使用接口,而不直接用类呢?

首先需要明白,接口是一个规范(我喜欢理解为一种自带的属性),看到一本书上说得妙:“ 接口就是一份契约,由类实现契约。契约中我编写了某些大的方针与前提,而签了约的类可以具体问题具体分析来实现自己的功能”。比如接口A是具有“比较”功能的,接口B是具有“计算”功能的,那么要判断classC是继承A还是B,则需要看C需要实现什么功能了。
关于为什么不用类或者抽象类代替接口呢?
1:java中接口的编写相比类要简单的多
2:类只能实现单继承,比如A  extends B 而不能A extends B,C,D,要想实现这个功能,则必须使用接口。
   比如类集中的一个例子:public class TreeSet<E> extends AbstractSet<E> implements SortedSet<E>,Cloneable,Serializable,要想一个类带有多种属性的话,必须使用接口!!!



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值