如何运用接口中的变量?接口可以扩展吗?

115 阅读3分钟

你可以使用接口来引入多个类的共享常量,这样做只需要简单的声明包含变量初始化想要的值的接口就可以了。

如果你的一个类中包含那个接口(就是说当你实现了接口时),所有的这些变量名都将作为常量看待。这与在C/C++中用头文件来创建大量的 #defined 常量或const 声明相似。如果接口不包含方法,那么任何包含这样接口的类实际并不实现什么。

这就像类在类名字空间引入这些常量作final变量。下面的例子运用了这种技术来实现一个自动的“作决策者”:

import java.util.Random; 
interface SharedConstants { 
 int NO = 0; 
 int YES = 1; 
 int MAYBE = 2; 
 int LATER = 3; 
 int SOON = 4; 
 int NEVER = 5; 
} 
class Question implements SharedConstants { 
 Random rand = new Random(); 
 int ask() { 
 int prob = (int) (100 * rand.nextDouble()); 
 if (prob < 30) 
 return NO; // 30% 
 else if (prob < 60) 
 return YES; // 30% 
 else if (prob < 75) 
 return LATER; // 15% 
 else if (prob < 98) 
 return SOON; // 13% 
 else 
 return NEVER; // 2% 
 } 
} 
class AskMe implements SharedConstants { 
 static void answer(int result) { 
 switch(result) { 
 case NO: 
 System.out.println("No"); 
 break; 
 case YES: 
 System.out.println("Yes"); 
 break; 
 case MAYBE: 
 System.out.println("Maybe"); 
 break; 
 case LATER: 
 System.out.println("Later"); 
 break; 
 case SOON: 
 System.out.println("Soon"); 
 break; 
 case NEVER: 
 System.out.println("Never"); 
 break; 
 } 
 } 
 public static void main(String args[]) { 
 Question q = new Question(); 
 answer(q.ask()); 
 answer(q.ask()); 
 answer(q.ask()); 
 answer(q.ask()); 
 } 
}

注意该程序利用了Java的一个标准类:Random,该类提供伪随机数。它包含若干个方法。通过这些方法你可以获得你程序所需形式的随机数。该例中,用到了nextDouble( )方法。它返回0.0到1.0之间的随机数。

该例子程序中,定义了两个类Question和AskMe。这两个类都实现了SharedConstants接口。

该接口中定义了NO、YES、MAYBE、SOON、LATER和NEVER。每个类中,代码就像自己定义或继承了它们一样直接引用了这些变量。下面是该程序的输出示例。注意每次运行结果不同。

Later 
Soon 
No 
Yes 

接口可以通过运用关键字extends被其他接口继承。语法与继承类是一样的。当一个类实现一个继承了另一个接口的接口时,它必须实现接口继承链表中定义的所有方法。下面是一个例子:

// One interface can extend another. 
interface A { 
 void meth1(); 
 void meth2(); 
} 
// B now includes meth1() and meth2() -- it adds meth3(). 
interface B extends A { 
 void meth3(); 
} 
// This class must implement all of A and B 
class MyClass implements B { 
 public void meth1() { 
 System.out.println("Implement meth1()."); 
 } 
 public void meth2() { 
 System.out.println("Implement meth2()."); 
 } 
 public void meth3() { 
 System.out.println("Implement meth3()."); 
 } 
} 
class IFExtend { 
 public static void main(String arg[]) { 
 MyClass ob = new MyClass(); 
 ob.meth1(); 
 ob.meth2(); 
 ob.meth3(); 
 } 
}

作为一个实验你也许希望移走MyClass中meth1( )的实现。这将导致编译时错误。前面讲过,任何实现接口的类必须实现该接口定义的所有方法,包括从其他接口继承的任何方法。

尽管我们在本书中包括的例子没有很频繁的用到包和接口,这两个工具是Java编程环境中的重要部分。

实质上所有用Java编写的实际的程序和小应用程序都被包含在包中。一个数字也可能实现接口。因此,游刃有余的运用这些工具是非常有用的。