5. Comparable接口7.1 接口举例//对象间比较大小
public interface Comparable{
int compareTo(Object o);
}
//以某一个天体为中心环绕的多个天体间,各自距中心的轨道距离比较(水星<金星<地球)
class Body implements Comparable{
//body fields omitted
int orbitalDistance = …//set during construction
public int compareTo(Object o){
Body other = (Body)o;
if (orbits == other.orbits)
return orbitalDistance – other.orbitalDistance;
else
throw new IllegalArgumentException("bad orbit");
}
}
注意:实现接口的类必须实现接口中的所有方法;
如果仅实现接口中的部分方法,该类必须被说明为抽象的。
6. 接口的优势是用于说明和使用接口类型的变量。7.1 接口举例//通用的排序类
class Sorter{
public static Comparable[] sort(Comparable[] list){ //无需考虑具体排序对象的类型
//implementation details
return list;
}
}通过接口类型的引用只能访问接口的成员。Comparable obj = new Body();
String name = obj.getName(); //INVALID: Comparable has no getName method接口类型的引用隐含地可作为Object类型的引用。String desc = obj.toString(); //正确的
7. 接口可说明三种类型的成员(所有成员都隐含为public)
常量(域)
方法
内嵌类和接口
接口常量
接口方法
接口修饰符
public:该接口可公共访问;
abstract:所有接口隐含为抽象的,所以可省略;
strictfp:该接口说明的所有float和double表达式均按严格浮点数计算。7.2 接口的说明 interface Verbose {
int SILENT = 0;
int TERSE = 1;
int NORMAL = 2;
int VERBOSE = 3;
void setVerbosity(int level);
int getVerbosity();
}public abstractpublic static final
8. 使用extends关键字扩展接口。可同时扩展多个接口。
扩展接口中包含被扩展接口的所有方法和常量。
可将一个接口类型的表达式传给一个具有Object类型引用的方法7.3 扩展接口WXYZinterface W{ };
interface X extends W{ };
class Y implements W{ };
class Z extends Y implements X{ };WXZYinterface W{ };
interface X extends W{ };
interface Y extends W{ };
class Z implements X,Y{ };protected void twiddle (W wRef){
Object obj = wRef;
//...
}接口类型表达式表示的对象肯定
属于某个类,而所有类都是根类
Object的子类。
9. 在继承中,若常量名相同,则使用受限的名来访问。7.3.1 继承和隐藏常量Interface PokerDeck
DECK_SIZEInterface TarotDeck
DECK_SIZEInterface ( or class ) MultiDeck
PokerDeck.DECK_SIZE;
TarotDeck.DECK_SIZE;多重继承Interface PokerDeck
DECK_SIZEInterface ( or class ) MultiDeck
PokerDeck.DECK_SIZE;
DECK_SIZE;//新定义的添加新常量
10. 类型层次较深,通过显式类型转换访问隐藏常量。7.3.1 继承和隐藏常量Interface X
int val =1;Interface Y
int val = 2;
int sum=0;class ZZ z = new Z();
System.out.println("z.val=" + z.val + z.sum +
", ((Y)z).val = " + ((Y)z).val +
", ((X)z).val = " + ((X)z).val);z.val=20, ((Y)z).val = 2, ((X)z).val = 1
11. 在多重继承中,当相同名字的方法出现在多个接口时(基调指方法的
名以及形参的数目和类型):
方法名相同,但含有不同数目或不同类型的参数子接口有两个名复用的方法,它们有相同的名字和不同的基调。基调完全相同子接口有一个此基调的方法两方法仅返回类型不同。两个超接口不能同时实现。两个方法仅引发的异常类型不同用唯一的实现满足这两种引发的异常类型。7.3.2 继承、改写和名复用XYZinterface X {
void setup() throws SomeException;
}
interface Y {
void setup();
}
class Z implements X,Y {
public void setup() {
//...
}
}