java 中方法工厂和匿名内部类

    xiaoxiao2021-03-25  82

    参考书目《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写好的对象传入其中,进而实现用户的需求。

    转载请注明原文地址: https://ju.6miu.com/read-25173.html

    最新回复(0)