好久没有写博客了,最近真的是太忙了,没有时间写呀。补充一点,寒假在家里看Thinking in Java,但是看到一半时就发现真的是看不懂了,然后就一直停在那里没什么显著的进展了,最近上课老师讲了Java的一些东西,发现以前的理解真的是没理解。以前的博客学习笔记真的是没什么含金量,但那也是个学习的过程,就不删除了吧,毕竟那也是我的学习的一个过程,废话不多说了,写点关于接口的理解吧。
interface貌似与class平级,都会生成.class文件。在接口中要声明方法,但不可给出具体的实现,这一点与抽象类不同,要想使用接口就必须要有类实现接口(这么说似乎也不对,如果我仅仅无聊地在接口中定义了一些变量呢,这些变量都是自动static和final的,那我下面是不是就可以使用这些变量呢?!是的,其实这是在Java SE5中实现C++的enum的具有相同效果的唯一途径(书上写的),以前的人就是这么干的!),实现了接口中的方法,接口才可以被使用。
一个引用被声明为接口类型,这是不是就相当于向上转型呢,然后接下来一句就应该是调用子类的方法吧(抽象类里是这么说的吗?)。代码的可扩展性就强了,这真是极好的。
一个类继承另一个类,实现一些接口,就多重继承了,似乎比C++机制要好那么一丢丢。当然,我们也可以用接口继承接口(接口真的和类是同级的吗?),然后接口就被扩展了。适配接口,这里有个很好的例子:
package interfaces;
//thingking in java P182
//: interfaces/RandomWords.java
// Implementing an interface to conform to a method.
import java.nio.*;
import java.util.*;
public class RandomWords 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(new RandomWords(10));
while(s.hasNext())
System.out.println(s.next());
}
} /* Output:
Yazeruyac
Fowenucor
Goeazimom
Raeuuacio
Nuoadesiw
Hageaikux
Ruqicibui
Numasetih
Kuuuuozog
Waqizeyoy
*///:~
太漂亮了!Scanner的构造方法要求的参数是Readable(接口,这个接口为Scanner而生)的,我们就实现这个接口,然后就可以作为Scanner的参数了,漂亮!
接口与工厂,增加了间接性,似乎是无用,但这似乎增加了代码的复用性,未尝不好,但这是不是值得?这一点我还没有考虑清楚。
package interfaces;
//: interfaces/Factories.java
import static net.mindview.util.Print.*;
interface Service {
void method1();
void method2();
}
interface ServiceFactory {
Service getService();
}
class Implementation1 implements Service {
Implementation1() {} // Package access
public void method1() {print("Implementation1 method1");}
public void method2() {print("Implementation1 method2");}
}
class Implementation1Factory implements ServiceFactory {
public Service getService() {
return new Implementation1();
}
}
class Implementation2 implements Service {
Implementation2() {} // Package access
public void method1() {print("Implementation2 method1");}
public void method2() {print("Implementation2 method2");}
}
class Implementation2Factory implements ServiceFactory {
public Service getService() {
return new Implementation2();
}
}
public class Factories {
public static void serviceConsumer(ServiceFactory fact) {
Service s = fact.getService();
s.method1();
s.method2();
}
public static void main(String[] args) {
serviceConsumer(new Implementation1Factory());
// Implementations are completely interchangeable:
serviceConsumer(new Implementation2Factory());
}
} /* Output:
Implementation1 method1
Implementation1 method2
Implementation2 method1
Implementation2 method2
*///:~
对于任何的类,都可以创建一个接口加一个工厂,但是如果是不必要的增加这种抽象性是不值得的。如果能用类顺利解决问题,那就用类,除非是接口的必需性很明确。
有人说:接口很好,但容易被滥用!
修改以前的学习笔记去!
end.