ELWG接口与内部类王斌2004-02-23ELWG接口-简介接口就是方法定义和常量值的集合。从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。接口是用来描述类的功能,但不指明具体的实现方式。一个类可以实现一个或多个接口。只要类实现了接口,就可以在任何需要该接口的地方使用这个类的对象。ELWG接口-作用通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。通过接口可以指明多个类需要实现的方法。通过接口可以了解对象的交互界面,而不需了解对象所对应的类。ELWG接口-定义方式[public]interfaceinterfaceName[extendslistOfSuperInterface]{……//常量定义和方法定义}ELWG接口-定义方式interfaceCollection{intMAX_NUM=100;voidadd(Objectobj);voiddelete(Objectobj);Objectfind(Objectobj);intcurrentCount();}ELWG接口-实现用implements子句来表示一个类使用某个接口。在类体中可以使用接口中定义的常量,而且必须实现接口中定义的所有方法。一个类可以实现多个接口,在implements子句中用逗号分隔。ELWG接口-实现classFIFOQueueimplementscollection{voidadd(Objectobj){……}voiddelete(Objectobj){……}Objectfind(Objectobj){……}***currentCount{……}}ELWG接口-与抽象类之区别抽象类对应的是类的一种概化(泛化),是种一般到特殊的关系,是种少到多的关系。不同的视角,得到的抽象结果不同。例如人这个类与自然界的人就是抽象的关系,无论你从什么角度看,自然界的人都不会因为你的抽象而发生改变,变的是你自己的观察角度(即抽象出的类)!接口对应的是实现,是一种规约到设计/实施的关系。ELWG接口-与抽象类之区别Java中,类之间的继承只能是单继承,而一个类却可以实现多个接口,接口的出现解决了类的多重继承的问题。ELWG接口-应用示例(设计模式)工厂模式分为:简单工厂模式、工厂模式、抽象工厂模式。简单工厂模式又称“静态工厂方法模式”,属于创建性模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。ELWG接口-应用示例(SimpleFactory)ELWG接口-应用示例(SimpleFactory)范例(农场公司)ELWG接口-应用示例(Factory)工厂模式又称为“多态性工厂”,属于设计模式中的创建性模式。工厂模式采用一个抽象工厂的角色,负责所有产品的创建工作。负责具体创建各种产品的工厂类是抽象工厂的子类。ELWG接口-应用示例(Factory)ELWG接口-应用示例(Factory)范例(EJB)ELWG接口-应*示例(Factory)范例(EJB)ELWG接口-应用示例(AbstractFactory)抽象工厂模式,又称为“工具箱模式”,属于创建性模式。可以处理具有相同(相似)等级结构的多个产品族中的产品对象创建问题。每一个具体工厂角色要负责几个不同等级的产品对象的创建,也可以理解为:将原来可以创建的一个产品分解成为更加细致的几个零件创建,这样,更利于组件的重用。ELWG接口-应用示例(AbstractFactory)ELWG接口-应用示例(AbstractFactory)范例(窗体风格)ELWG内部类-简介内部类是定义在其他类内部的类。嵌套内部类--包括在外壳类作用域内的类;局部内部类--包括在外壳类的内部方法作用域的类;匿名内部类--只需要为局部内部类建立一个对象,不必为该类指定一个名字。ELWG内部类-作用内部类对象能够访问创建它的对象的实现-包括那些私有数据;内部类能够隐藏起来,不为同一包中的其他类所见;匿名内部类可以方便地定义运行时回调;使用内部类在编写事件驱动的程序时用起来很方便。ELWG内部类-特殊语法规则内部类对于外部引用的正确语法是:OuterClass.this--表示了外部类的一个引用。如:InterestAddr是BankAccount中的内部类,其中InterestAddr中的actionPerfomed方法引用BankAccount中的变量采用的方式是:publicvoidactionPerformed(ActionEventevent){doubleinterest=BankAccount.this.balance*this.rate/100;}ELWG内部类-特殊语法规则内部类的对象构造器可以显式表示,语法如下:ActionListeneraddr=this.new.InterestAddr(constructionparameters);Notes:若内部类InterestAddr是个公有类,那么在程序的其它地方使用BankAccount.InterestAddr来引用它。ELWG内部类-安全性内部类属于编译器现象,而和虚拟机无关。Java编译器会把内部类翻译成使用$符分隔外部类名和内部类名的常规class文件。其中,内部类对于外部类的引用通过this$0附加实例字段。ELWG内部类-安全性内部类通过调用编译器自动生成的静态方法access$000和access$018来访问外部类中的私用变量。虽然内部类访问了私有数据字段,而且可以通过加到外部类所在的包中的其他类访问到它,但这决不是件容易的事情,它需要很高的技巧和很大的决心。程序员只有费劲辛苦构造或者改动类文件才能达到此目的,而不可能在无意中就获得对类的访问。ELWG内部类-局部内部类局部内部类-定义在外部类方法中的类;局部内部类不使用访问指示符,它们的范围总是限定在他们的程序块中;局部内部类具有最大的隐藏性;局部内部类可以访问外部类所在方法中的局部变量,但局部变量必须声明为final类型。ELWG内部类-局部内部类局部内部类通过编译器产生的val$(局部变量)来访问外部类的局部类。基于以上原因,局部类的方法只能使用那些声明为final的局部变量,由于声明为final变量后,**就不可能随便进行修改,这样,局部变量和局部类所建立的变量拷贝总是具有相同的值。ELWG内部类-匿名内部类匿名内部类语法:newSuperType(constrcutionparameters){内部类方法和数据;}newinterfacename(constrcutionparameters){内部类方法和数据;}匿名内部类主要用在方便地定义运行时的回调,以及编写事件驱动方面。ELWG内部类-静态内部类如果只想内部类隐藏在另一个类中,而不需要内部类具有对外部类对象的引用,这种情况下,就可以将内部类声明为static类型,形成静态内部类。静态内部类如果在一个方法中构造,这个方法必须是静态的方法。ELWG综述总之,在java中的内部类和接口加在一起,可以的解决常被C++程序员抱怨java中存在的一个问题——没有多继承。实际上,C++的多继承设计起来很复杂,而java通过内部类加上接口,可以很好的实现多继承的效果。ELWG参考书目《Java2核心技术卷I:基础知识》机械工业出版社;《Java与模式》电子工业出版社ELWG完谢谢大家!