技术开发 频道

再读Think In Java接口篇



    四. 接口和内部类

    【IT168 专稿】我们知道abstract关键词能让你在类里创建一个或多个没有定义的方法—你给出接口,但是留一部分没做定义,这部分由它的派生类来实现。而interface关键词则创建了一种完全抽象的,根本不提供实现的类,它不仅是一种是抽象类的极端表现的形式,而且是一种能让你将一个对象上传到多个基类的手段。它提供了类似C++的“多重继承(multiple inheritance)”的功能。

    Interface是对abstract关键词的进一步强化,它能让你定义类的形式:方法名,参数列表,返回值,它的方法不用特别声明都是public的。Interface也可以包含数据成员,但是它天生就是static和final的,准确得说,它不是接口的组成部分,而是保存在这个接口的动态存储区。Interface的意思是“所有”“实现”这个接口的类都应该长成这个样子,只要用到了这个interface都知道它有哪些方法可以调用。当你implements一个interface的时候,你必须把这个interface的方法定义成public的,不这样java编译器就会报错。

    Java的多重继承,由于interface不带任何实现——也就是说interface和内存无关——因此不会有谁去阻止interface之间的结合。这一点很重要,因为有时你会遇到“x既是a又是b 还是c”这种将多个接口结合在一起的行为,被称为“多重继承”。Java并不强制你必须去继承abstract或“具体”类,但是你只能继承一个非interface的类,所有别的基类元素都必须是interface,你
只需把他们放在implments关键词后面,用逗号隔开,你可以实现任意多个interface;也可以把这个类上传到interface。

    接口也可以继承,通过继承来扩展interface,加入新的方法,也可以通过继承将多个接口合并成新的interface接口继承还有其特殊的方面就是可以一次继承多个接口,通常extends只用于类,但是由于一个接口可以由多个interface拼接而成,因此在创建新的接口的时候可以用extends表示多个“基接口”,base Interface之间要用逗号分隔。

    接口的嵌套,接口既可以嵌套在类里,也可以嵌套在接口当中,这样就有趣的地方。在类里嵌套接口的语法和没有嵌套在类里的接口一样,也可以是public和package权限,public和package权限的接口可以被实现成public,package甚至private权限的嵌套类(注:嵌套在类里的接口可以是private,而嵌套在接口里的接口不可以)。接口和接口之间也可以嵌套,接口的规则在接口嵌套里依然有效,特别是接口的元素必须是public的。实现接口时,不一定要实现嵌套在里面的接口,而private的接口也只能在定义它的类里出现。示例如下:

class A { //package 这里package权限接口同样可以是public interface C{ void f(); } public class Cimp implements C{ public void f(){ System.out.println(“implements package interface as public class”); } } private class Cimp1 implements C{ public void f(){ System.out.println(“implements package interface as private class”); } } //private权限接口只能嵌套在类当中,不能嵌套在接口当中 private interface D{ void f(); } }

    内部类,在一个类里定义另一个类也是可以的,这被称为“内部类”,内部类能让你从逻辑上将相互从属的类组织起来,并且在类的内部控制访问权限。下面结合例子说明:

public class StudyCourse{ //内部类 class Students{ private int num =20; public int getXkrs{ return num;} } //内部类 class KsCj{ private String kcm ; KsCj(String tempkcm){ kcm = tempkcm; } String getKcm(){return kcm;} } public void course(String tempkcm){ Students stu = new Students(); KsCj ksCj = new KsCj(tempkcm); } public Static void main(String[] args){ StudyCourse stuCou = new StudyCourse(); stuCou.course(“computer”); } }
0
相关文章