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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值