在前文中,介绍了抽象类的一些基本知识,在这篇短文中,简单地介绍和实现一个接口。
Core Java里关于抽象接口有段很有概括性,总结性的话:an interface is not a class but a set of requirements for classes that want to conform to the interface. 即:接口不是类,接口是需求的一个集合,而这些需求又是一些具有相同要求的类提出的。所以从某种意义上讲,接口和抽象类还是有共同点的。我借用Core Java中提到Java.lang.Comparable<T>接口。在《Java中的排序(一)》中我使用了这个类,但是在JDK1.5中该接口被扩展为泛型化的接口。所以这里先看下该接口的源码:
public interface Comparable<T> { public int compareTo(T o); }
可以看出,interface以及它的方法是被public修饰的。没错,如果你将它们的修饰符改成protected或者private,那么就会有编译错误。实际上,如果一个接口被protected或者private修饰,那还怎么被别的类实现呢?当然你可以不加任何修饰符在interface和它的方法之前。前者意味着默认的访问权限,但是如果你不加任何修饰符在方法之前,那么会被自动提升为public,很正常,不然怎么让实现该接口的类去实现这个方法呢?接口中的变量和方法类似,只不过是默认为public static final。
好了,下面改一下在《Java中的排序(一)》出现的代码,实现泛型的Comparable接口:
import java.util.*; interface Test{ int test(); } class Mark implements Comparable<Mark>{ private String name; private String course; private double mark; public Mark(String name, String course, double mark){ this.name = name; this.course = course; this.mark = mark; } public int compareTo(Mark o){ Mark m = o; return (int)(this.mark - m.mark); } public String toString(){ return "( "+ name +"-"+ course +"-"+ String.valueOf(mark) +" )"; } } public class TestCollectionsSort { public static void main(String args[]){ List<Mark> list = new ArrayList<Mark> (); Comparable<Mark> c = new Mark("S1", "Maths", 68.5); Mark mark1 = new Mark("S1", "Maths", 68.5); Mark mark2 = new Mark("S1", "Maths", 78.5); Mark mark3 = new Mark("S1", "Maths", 62.5); Mark mark4 = new Mark("S1", "Maths", 98.5); Mark mark5 = new Mark("S1", "Maths", 82.5); list.add(mark1); list.add(mark2); list.add(mark3); list.add(mark4); list.add(mark5); System.out.println(list); Collections.sort(list); System.out.println(list); } }
好了,抽象类和接口的基本知识,就介绍到这里,下一篇blog将侧重于两者的区别。