Java基础教程(14)--嵌套类

  Java允许在一个类中定义另外一个类,这样的类被称为嵌套类,就像下面这样:

class OuterClass {     ...     class NestedClass {         ...     } }

  嵌套类分为两种:静态的和非静态的。声明为static的嵌套类被称为静态嵌套类,非静态嵌套类则被称为内部类:

class OuterClass {     ...     static class StaticNestedClass {         ...     }     class InnerClass {         ...     } }

  嵌套类是其所在的外部类的成员。内部类可以访问外部类中的其他成员,即使这个成员被private修饰。静态嵌套类则没有访问外部类中其他成员的权限。作为外部类的一个成员,嵌套类可以被声明为private、public、protected或者包私有的。
  下面是几个为什么要使用嵌套的类原因:

  • 能够将仅在一个地方使用的类合理地组合。如果一个类可能只对于另外一个类有用,此时将前者组合到后者,可以使得程序包更加简洁。
  • 增强封装性。假如有两个类A和B,B类需要使用A类中的成员,而恰好该成员又是仅类内部可见(private)的,如果将B定义为A的嵌套类,则B可以使用A的任何成员,而且B也可以声明为外部不可见(private),将B隐藏起来。
  • 能够使代码可读性和维护性更强。嵌套的类代码相较于顶级类,更靠近它被使用的地方,方便查看。

一.静态嵌套类

  就像静态方法和静态变量一样,静态嵌套类是和外部类相关联的。和静态方法一样,静态嵌套类不能直接引用实例变量和实力方法,只能通过一个对象引用。实际上,可以将静态嵌套类看作是一个顶级类,只不过将其嵌套在其他类中方便打包。
  静态嵌套类可以用过外部类的名字去访问:

OuterClass.StaticNestedClass

  可以使用下面的语法为静态嵌套类创建对象:

OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();

二.内部类

  就像实例方法和实例变量一样,内部类与外部类的实例相关联并且可以直接访问外部类的方法和成员。并且,因为内部类与外部类的实例相关联,因此它内部不能定义静态成员。
  要实例化内部类,必须创建外部类的对象,然后使用这个对象去创建内部类的对象:

OuterClass outerObject = new OuterClass(); OuterClass.InnerClass innerObject = outerObject.new InnerClass();

  实际上,还有两种特殊的内部类————局部类和匿名类。有关这两种类的内容将会在下文中介绍。强烈建议不要对内部类(包括局部类和匿名类)进行序列化(把对象转换为字节序列的过程称为对象的序列化,有关序列化的内容会在以后的文章中进行介绍)。

三.屏蔽现象

  如果一个类型(例如成员变量或参数)与外部作用域中的类型同名,那么内部作用域中的声明将会屏蔽外部作用域中的声明,这样就不能直接通过名称去访问外部作用域中同名的类型。如下例所示:

public class ShadowTest {     public int x = 0;      class FirstLevel {         public int x = 1;          void methodInFirstLevel(int x) {             System.out.println("x = " + x);             System.out.println("this.x = " + this.x);             System.out.println("ShadowTest.this.x = " + ShadowTest.this.x);         }     }      public static void main(String... args) {         ShadowTest st = new ShadowTest();         ShadowTest.FirstLevel fl = st.new FirstLevel();         fl.methodInFirstLevel(23);     } }

  这个例子的输出如下:

x = 23 this.x = 1 ShadowTest.
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信