当一个类没有调用此类的方法,如何实现了这些功能的呢?
先看下面这个代码:
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,要想一个类带有多种属性的话,必须使用接口!!!