参考书目《java编程思想(4th)》
1.在工厂对象上调用的是创建方法,而不直接调用构造器,工厂对象将生成接口的某个实现的对象。这样能将代码与接口的实现分离。如在后续的线程部分将用到执行器方法工厂。在迭代器部分当中也用到了方法工厂,Iterator接口包含三种抽象方法,Iterable接口则以Iterator接口建立一个iterator()方法,在诸多容器实现了Iterable接口而不是Iterator接口,从而建立容器类iterator()方法的多态性(个人理解)。
2.在匿名内部类中,只能new 父类构造器(参数)|实现接口(),这里返回类型会向上转型,也就是接口的多态性。ImFactory1中new 出的对象和ImFactory2中new 出的ImplementInterface相同,但是相比于后者,前者没有类名,所以编译器会生成一个隐式的无参构造器。
interface Service{
void method1();
void method2();
}
interface ServiceFactory{
Service getService();
}
class ImFactory1 implements ServiceFactory{
public Service getService(){
return new Service(){
public void method1(){ System.out.println("Service.method1()");}
public void method2(){ System.out.println("Service.method2()");}
};
}
}
class ImplementInterface implements Service{
ImplementInterface(){}
public void method1(){ System.out.println("Service.method1()");}
public void method2(){ System.out.println("Service.method2()");}
}
class ImFactory2 implements ServiceFactory{
public Service getService(){
return new ImplementInterface();
}
}
public class Factory {
public static void main(String[] args) {
// TODO Auto-generated method stub
ImFactory1 ii=new ImFactory1();
ImFactory2 jj=new ImFactory2();
Service k=ii.getService();
Service l=jj.getService();
k.method1();
k.method2();
l.method1();
l.method2();
}
}
测试结果:
Service.method1()
Service.method2()
Service.method1()
Service.method2()
3.抽象类同样具有多态性,可以用抽象类来声明抽象类的引用,但是不能new出来,对于接口其中的每一个方法都是抽象方法(dummy method),下面可以看到Wind和Piano使用关键字extends继承Instrument,接口则使用关键字implements,覆盖抽象类的方法,引用只能接受子类对象,调用方法也是动态绑定的。
abstract class Instrument{
public String what(){
return "Instrument";
}
public abstract void play(int i);
}
class Wind extends Instrument{
@Override
public void play(int i){
System.out.println("Now playing Wind("+i+")");
}
public String what(){
return "Wind";
}
}
class Piano extends Instrument{
public void play(int i){
System.out.println("Now playing Piano("+i+")");
}
@Override
public String what(){
return "Piano";
}
}
public class Abstr {
void Select(Instrument k,int j){
k.play(j);
k.what();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Abstr ab=new Abstr();
ab.Select(new Wind(),5);
ab.Select(new Piano(),4);
}
}
测试结果:
Now playing Wind(5)
Now playing Piano(4)
4.通过提供接口,客户端来实现接口,用接口来声明引用作为方法的参数,客户端将实现的对象传入已经写好的方法当中,来调用客户端本身所写的程序。如在线程当中,提供Runnable接口,ExecutorService中的execute(Runnable command)方法,new写好的对象传入其中,进而实现用户的需求。