中超

Java内部类(Inner Class)详解(2)_a

2020-01-16 18:35:15来源:励志吧0次阅读

2 Member class(成员类)

一个静态成员类,若去掉“static”关键字,就成为成员类。如下示例代码,Inner1/Inner2/Inner3/Inner4就是Outer的四个成员类

publicclassOuter{

//justlikeinstancemethod,memberclasshaspublic/private/defaultaccessprivilegelevels

privateintdata;

//accessprivilegelevel:public

publicclassInner1{

privateintdata;

privateintdata1;

publicInner1(){

//memberclasscanaccessitsouterclass'instancefielddirectly

data1=1;

//itselfdatafield

data=1;

//itsouterclassinstancefield

Outer.this.data=1;

}

}

//accessprivilegelevel:default

classInner2{

//cannotdefinestaticfiled,method,classinmemberclass

//staticintj=1;

//but,"staticfinal"compoundisallowed

staticfinalintCONSTANT=1;

}

//accessprivilegelevel:private

privateclassInner3{

publicclassInner4{

}

}

//infact,Inner5isnotamemberclassbutastaticmemberclass

interfaceInner5{

}

privatestaticvoidstaticMethod(){

//cannotcreateamemberclassinstancedirectlyinouterclass'staticmethod

//Inner1inner1=newInner1();

}

privatevoidinstanceMethod(){

//cancreateamemberclassinstanceinouterclass'instancemethod

Inner1inner1=newInner1();

}

}

classTest{

publicTest(){

//cannotcreatememberclassinstancedirectlyinclassotherthanouterclass

//Outer.Inner2inner2=newOuter.Inner2();

//createamemberclassinstanceoutsideit'souterclass

Outerouter=newOuter();

Outer.Inner1inner1=outer.newInner1();

}

}

2.1 成员类特性

· 类似于外部类的实例函数,成员类有public/private/default权限修饰符

· 一个成员类实例必然所属一个外部类实例,成员类可访问外部类的任一个实例字段和实例函数。

2.2 成员类约束

成员类不能与外部类重名

不能在成员类中定义static字段、方法和类(static final形式的常量定义除外)。因为一个成员类实例必然与一个外部类实例关联,这个static定义完全可以移到其外部类中去

成员类不能是接口(interface)。因为成员类必须能被某个外部类实例实例化,而接口是不能实例化的。事实上,如示例代码所示,如果你以成员类的形式定义一个接口,该接口实际上是一个静态成员类,static关键字对inner interface是内含(implicit)的。

2.3 新增语法

一个成员类实例必然所属于其外部类的一个实例,那么如何在成员类内部获得其所属外部类实例呢?如示例代码所示,采用“OuterClass.this”的形式。

2.4 指定内部类实例所属的外部类实例

内部类实例可在其外部类的实例方法中创建,此新创建内部类实例所属的外

部类实例自然就是创建它的外部类实例方法对应的外部类实例。

另外,如示例代码所示,对于给定的一个外部类实例outerClass,可以直接创建其内部类实例,语法形式为:

OuterClass.InnerClass innerClass = outerClass.new InnerClass();

2.5 什么时候使用成员类

成员类的显著特性就是成员类能访问它的外部类实例的任意字段与方法。方便一个类对外提供一个公共接口的实现是成员类的典型应用。

以JDK Collection类库为例,每种Collection类必须提供一个与其对应的Iterator实现以便客户端能以统一的方式遍历任一Collection实例。每种Collection类的Iterator实现就被定义为该Collection类的成员类。例如JDK中AbstractList类的代码片断:

publicabstractclassAbstractList<E>extendsAbstractCollection<E>implementsList<E>{

privateclassItrimplementsIterator<E>{

………;

}

publicIterator<E>iterator(){

returnnewItr();

}

}

因为定义在AbstractList中的Itr可访问AbstractList中的任意字段和方法,所以很方便实现Iterator,无需AbstractList对外暴露更多的接口。

试想,如果没有成员类机制,只有在AbastractList源码之外定义一个实现Iterator的类Itr,该类有一个AbstractList实例成员list,为了Itr能获取list的内部信息以便实现遍历,AbstractList必然要向Itr开放额外的访问接口。

查看本文来源

小孩子不消化吃什么好
宝宝积食了吃什么药好
小孩脾胃虚弱吃什么好
小儿手足口病治疗方法有哪些
分享到: