------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
接口为我们提供了一种将接口和实现分离的更加结构化的方法。
用abstract创建抽象类和抽象方法很有用,因为他使类的抽象性明确起来,并告诉用户和编译器打算怎么使用他们。
interface关键字使抽象的概念更近了一步。
接口中包含域,但是这些域是隐式的,static的和final的。
需要用implements关键字。
接口中的方法必须为public的。
使用接口的核心原因:为了能够向上转型为多个基类型,以及由此带来的灵活性。第二个原因是,防止客户端程序员创建该类的对象。
如何选择接口和抽象类呢?如果知道某事物应该成为一个积累,那么第一选择应该是使他成为一个接口。
在使用接口时,在打算组合的不同接口中使用相同的方法名通常会造成代码可读性的混乱,应该尽量避免这种情况。
同一个接口中允许有多个不同的具体实现,比如:
//:interfaces/RandomWords.java
// Implementing aninterface to conform to a method.
import java.nio.*;
importjava.util.*;
public classRandomWords implements Readable {
private static Random rand = new Random(47);
private static final char[] capitals =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
private static final char[] lowers =
"abcdefghijklmnopqrstuvwxyz".toCharArray();
private static final char[] vowels =
"aeiou".toCharArray();
private int count;
public RandomWords(int count) { this.count =count; }
public int read(CharBuffer cb) {
if(count-- == 0)
return -1; // Indicates end of input
cb.append(capitals[rand.nextInt(capitals.length)]);
for(int i = 0; i < 4; i++) {
cb.append(vowels[rand.nextInt(vowels.length)]);
cb.append(lowers[rand.nextInt(lowers.length)]);
}
cb.append(" ");
return 10; // Number of characters appended
}
public static void main(String[] args) {
Scanner s = new Scanner(newRandomWords(10));
while(s.hasNext())
System.out.println(s.next());
}
} /* Output:
Yazeruyac
Fowenucor
Goeazimom
Raeuuacio
Nuoadesiw
Hageaikux
Ruqicibui
Numasetih
Kuuuuozog
Waqizeyoy
*///:~
恰当的原则:
优先使用类而不是接口,从类开始,如果接口的必需性变得非常明确,那么就进行重构。