接口总结
为什么要使用接口呢?其实大部分时候我们能不用接口尽量不用,因为比起抽象类来,它的运行速度是慢的。但正如书中所言,接口最吸引人的原因之一就是允许同一个接口具有不同的具体实现。其次,它向上转型也可以实现多个基类,防止客户端程序员创建该类的对象等等。接口可以实现多继承,而抽象类不可以。抽象类可以有一些默认的方法实现,接口没有。接口的访问修饰符默认是public的,不允许修改。接口没有构造器,接口不能实现main方法。
适配问题
在适配接口中,我们能学到, 可以依据不同接口,来给一个类实现不同的适配功能。这里也提到了Scanner类和Readable接口之间的适配问题。
同时将查阅过的文档和Readable接口的说明附上:
请看代码如下:
1 // Implementing an interface to conform to a method. 2 import java.nio.*; 3 import java.util.*; 4 5 public class RandomWords implements Readable { 6 private static Random rand = new Random(47); 7 private static final char[] capitals = 8 "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); 9 private static final char[] lowers = 10 "abcdefghijklmnopqrstuvwxyz".toCharArray(); 11 private static final char[] vowels = 12 "aeiou".toCharArray(); 13 private int count; 14 public RandomWords(int count) { this.count = count; } 15 public int read(CharBuffer cb) { 16 if(count-- == 0) 17 return -1; // Indicates end of input 18 cb.append(capitals[rand.nextInt(capitals.length)]); 19 for(int i = 0; i < 4; i++) { 20 cb.append(vowels[rand.nextInt(vowels.length)]); 21 cb.append(lowers[rand.nextInt(lowers.length)]); 22 } 23 cb.append(" "); 24 return 10; // Number of characters appended 25 } 26 public static void main(String[] args) { 27 Scanner s = new Scanner(new RandomWords(10)); 28 while(s.hasNext()) 29 System.out.println(s.next()); 30 } 31 }
这里实现了接口Readable中的read()方法。而它只是单独为Scanner创建的,让Scanner成为不会被限制的某个特定类。这样就解放了Scanner,它可以作用于更多的类型了。所以说,在现有类上增加新的接口,可以让方法接受接口类型,是一种让任何类都可以对该方法进行适配的方式。
接口的域
接口的任何域自动都是static和final的。在接口的常量初始化的时候必须给其初值。定义的常量中不允许有空final。
嵌套接口
在类中可以增加内部接口,内部接口可以被置为private,但是它的调用必须是用类中的某个private方法调用的。在接口中也可以镶嵌内部接口,但是所有的接口都是public。
参考以下代码:
//: interfaces/nesting/NestingInterfaces.java package interfaces.nesting; class A { interface B { void f(); } public class BImp implements B { public void f() {} } private class BImp2 implements B { public void f() {} } public interface C { void f(); } class CImp implements C { public void f() {} } private class CImp2 implements C { public void f() {} } private interface D { void f(); } private class DImp implements D { public void f() {} } public class DImp2 implements D { public void f() {} } public D getD() { return new DImp2(); } private D dRef; public void receiveD(D d) { dRef = d; dRef.f(); } } interface E { interface G { void f(); } // Redundant "public": public interface H { void f(); } void g(); // Cannot be private within an interface: //! private interface I {} } public class NestingInterfaces { public class BImp implements A.B { public void f() {} } class CImp implements A.C { public void f() {} } // Cannot implement a private interface except // within that interface's defining class: //! class DImp implements A.D { //! public void f() {} //! } class EImp implements E { public void g() {} } class EGImp implements E.G { public void f() {} } class EImp2 implements E { public void g() {} class EG implements E.G { public void f() {} } } public static void main(String[] args) { A a = new A(); // Can't access A.D: //! A.D ad = a.getD(); // Doesn't return anything but A.D: //! A.DImp2 di2 = a.getD(); // Cannot access a member of the interface: //! a.getD().f(); // Only another A can do anything with getD(): A a2 = new A(); a2.receiveD(a.getD()); } } ///:~
仔细看一看,这段代码极为有趣。