JAVA有一个特殊的类形式——内部类(这个词有点为难普通话不好的南方朋友)。今天我们就来聊聊内部类的一种:成员内部类。
如何定义成员内部类
那要如何定义成员内部类呢。
既然叫成员内部类,说明和成员变量是有类似的地方。从代码的层次结构上来看他是和成员变量处于相同层级的。
我们来举个例子。
上图代码中,在类OutClass中定义了一个成员变量name。在OutClass中又定义了一个类InClass,这个InClass是和OutClass的成员变量是同一个层级的,并且是非静态的。像InClass这样的类,我们就称之为成员内部类。
如何使用内部类
那这种定义在一个类中的内部类要怎么使用呢。
我这里从两个角度来说这个使用的方式。
第一种是,在外部类(如示例代码OutClass中)使用。下面举个例子。
上图代码中,在OutClass类中,定义了一个InClass的成员变量,这样的内部类使用方式从编码的形式来说和使用其他类是没有什么差别的。
第二种使用方式是在其他类中使用。也来举个例子。
如图中代码所示,要在其他的类中使用内部类,是需要通过外部类的对象才行,因为这个内部类是外部类对象的成员。
不过在其他类中想要这么使用内部类的前提是,内部类定义的访问权限是可以让外部访问才行,我们试试吧内部类的访问修饰符改一下。
如上面代码所示,将内部类的访问修饰符改为private之后,在其他类中使用时会因为访问不到而报错。也就是说成员内部类是可以和成员变量一样,隐藏在本类内部而只是暴露一定的功能出去的。
内部类访问外部类的成员变量、方法
我们知道一个类中访问本类的成员变量、方法可以通过this关键词来访问。那如果内部类要访问外部类要怎么做呢。像上面例子中外部类的成员变量名和内部类的成员变量名重名会不会有什么问题呢(示例中外部类和内部类都有名为name的成员变量)。废话不多说,上代码。
如上图代码中,内部类要访问外部类的成员变量或者方法,可以通过“外部类名.this.变量名或方法名”(如代码中的OutClass.this.test()、OutClass.this.name)。并且即便外部类的成员变量或方法是私有的,也是可以访问的。另外内部类和外部类的成员变量名重名是没有问题的。执行验证一下。
成员内部类不能有静态变量、方法
因为成员内部类是作为外部类的对象的成员来使用的,所以成员内部类中是不能有静态变量、方法的。
如上图中,我把上面的示例代码中的内部类的变量改成了静态的,会报错。添加了一个静态的方法,也是会报错的。
静态的内容就到了这里了,砖我已经抛好了,希望引来各位的玉。