简单的说,内部(inner)类指那些类定义代码被置于其它类定义中的类;而对于一般的、类定义代码不嵌套在其它类定义中的类,称为顶层(top-level)类。对于一个内部类,包含其定义代码的类称为它的外部(outer)类。
1 Static member class(静态成员类)
类声明中包含“static”关键字的内部类。如以下示例代码,
Inner1/Inner2/Inner3/Inner4就是Outer的四个静态成员类。静态成员类的使用方式与一般顶层类的使用方式基本相同。
java 代码
- public class Outer{
-
-
-
- public static class Inner1 {
- public Inner1() {
-
- staticMethod();
-
-
- }
- }
-
-
- static class Inner2
-
-
- private static class Inner3 {
-
- public static class Inner4
- }
-
- private static void staticMethod() {
-
-
- }
-
- private void instanceMethod() {
-
- Inner3 inner3 = new Inner3();
-
- Inner3.Inner4 inner4 = new Inner3.Inner4();
- }
- }
-
- class Test {
- Outer.Inner1 inner1 = new Outer.Inner1();
-
- Outer.Inner2 inner2 = new Outer.Inner2();
-
-
- }
1.1 静态成员类特性
静态成员类可访问外部类的任一静态字段或静态方法
像静态方法或静态字段一样,静态成员类有public/private/default权限修饰符
1.2 静态成员类约束
静态成员类不能与外部类重名
像外部类的静态方法一样,不能直接访问外部类的实例字段和实例方法
静态成员类只能定义于外部类的顶层代码或外部类其它静态成员类的顶层代码中(嵌套定义);不能定义于外部类的某个函数中。
1.3 新增语法
如示例代码所示,可以以“OuterClass.InnerClass”的方式来引用某个内部类。
1.4 什么时候使用静态成员类
B为A的辅助类,且只为A所用时,可将B定义为A的静态成员类。例如JDK中的LinkedList类就有Entry静态成员类:
java 代码
- public class LinkedList<e></e><E><e> </e>extends AbstractSequentialList<e></e><E><e>
</e>
- …;
- private static class Entry<e></e><E><e> { </e>
- E element;
- Entry<E><e> next; </e>
- Entry<E><e> previous; </e>
-
- Entry(E element, Entry<E><e> next, Entry<e></e></e><E><e><e> previous) { </e></e>
- this.element = element;
- this.next = next;
- this.previous = previous;
- }
- }
- …;
- }
显然,Entry用来表示LinkedList中的一个结点,只被LinkedList自身使用。
2 Member class(成员类)
一个静态成员类,若去掉“static”关键字,就成为成员类。如下示例代码,Inner1/Inner2/Inner3/Inner4就是Outer的四个成员类
java 代码
- public class Outer {
-
- private int data;
-
-
- public class Inner1 {
- private int data;
- private int data1;
- public Inner1() {
-
- data1 = 1;
-
- data = 1;
-
- Outer.this.data = 1;
- }
- }
-
-
- class Inner2 {
-
-
-
-
- static final int CONSTANT = 1;
- }
-
-
- private class Inner3 {
- public class Inner4
- }
-
-
- interface Inner5
-
- private static void staticMethod() {
-
-
- }
-
- private void instanceMethod() {
-
- Inner1 inner1 = new Inner1();
- }
- }
-
- class Test {
- public Test() {
-
-
-
-
- Outer outer = new Outer();
- Outer.Inner1 inner1 = outer.new Inner1();
- }
- }
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类的代码片断:
java 代码
- public abstract class AbstractList<E><e> </e>extends AbstractCollection<E><e> </e>implements List<e></e><E><e>{ </e>
- private class Itr implements Iterator<e></e><E><e> { </e>
- ………;
- }
-
- public Iterator<E><e> iterator() { </e>
- return new Itr();
- }
- }
因为定义在AbstractList中的Itr可访问AbstractList中的任意字段和方法,所以很方便实现Iterator,无需AbstractList对外暴露更多的接口。
试想,如果没有成员类机制,只有在AbastractList源码之外定义一个实现Iterator的类Itr,该类有一个AbstractList实例 成员list,为了Itr能获取list的内部信息以便实现遍历,AbstractList必然要向Itr开放额外的访问接口。
分享到:
相关推荐
java-内部类(InnerClass)详解.pdf
Java中inner_class内部类
Java内部类(innerclass).docx
1.Nested Class(嵌套类) 1.1.Nested class 1.2.Nested class的分类 1.3.Nested class的使用原因 2.Static Nested Classes 2.1.static nested class访问enclosing class(outer class)的成员 2.2.enclosing...
第11章 内部类(Inner class).ppt第11章 内部类(Inner class).ppt
java易混淆的地方,final, finally, finalize的区别,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类
this a java instance about innerclass application
匿名内部类 inner class 马克-to-win java视频的详细介绍
局部内部类 Local inner 马克-to-win java视频的详细介绍
在java语言中,有一种类叫做内部类(inner class),也称为嵌入类(nested class),它是定义在其他类的内部。
Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)
匿名内部类 inner class 马克-to-win java视频的详细介绍
2)当我们建立一个inner class时,其对象就拥有了与外部类对象之间的一种关系,这是通过一个特殊的this reference形成的,当内部类的成员方法中访问某个变量/方法时,如果在该方法和内部类中都没有定义过这个变量,...
本节内容包括 接口基本概念 使用接口的例子 接口的定义 接口的实现 接口与抽象类 接口和回调 内部类(介绍)
java内部类使用例子,可以运行
InnerClass01Test.java
很好的Java面试题第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。注: 静态内部类(Inner Class)意味着1创建一个static内部类的对象,不需要一个外部类对象,2不能从一个static内部类的一个对象访问一个外部类对象
匿名内部类 inner class 马克-to-win java视频的详细介绍
Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。注: 静态内部类(Inner Class)意味着1创建一个static内部类的对象,不需要一个外部类对象,2不能从一个static内部类的一个对象访问一个外部类对象