您的位置: 网站首页 > 程序开发 > Java程序设计 > 第7章 面向对象的高级特性 > 【7.2 内 部 类】

7.2 内 部 类

 

7.2     

内部类(InnerClass),也称嵌套类,是JDK 1.1区别于1.0版本的一个非常重要的新特性。内部类就是在某个类的内部嵌套定义的一个类。内部类可以是其他类的成员,也可以在一个语句块的内部定义,还可以在—个表达式内部匿名定义。

7.2.1  内部类介绍

内部类有下面这些特性。

·    类名只能在定义的范围内被使用,内部类的名称必须区别于外部类。

·    内部类可以定义为abstract

·    内部类可以声明为privateprotected

·    内部类可以使用包含它的类的成员变量,包括静态和实例成员变量,也可以使用内部类所在方法的局部变量。

·    内部类不能与包含它的类名相同。

·    内部类如果被声明为static,就变成顶层类,这样就不能再使用局部变量;内部类是顶层类时,才可以声明static成员。

·    内部类可以像外部类那样被继承,同样也可以实例化。

【例7-5一个内部类的例子。

public class mainClass

{

   public static void main(String []args)

   {

      mainClass obj=new mianClass();

      obj.printMethod();

   }

   void printMethod()

   {

      innerClass innObj=new innerClass();

      innObj.outFun();

   }

   class innerClass

   {

      public void outFun()

      {

      System.out.println("This is a  inner class testing!");

      }

   }

}

在本例中,内部类innerClass是作为类mainClass的成员,程序结构非常简单,就是通过内部类输出一个字符串。

7.2.2  内部类的使用

内部类作为一种特殊的类,它也有类的一般特性,如类的封装、实现和继承。下面介绍关于内部类的实例化和内部类的继承。

1.内部类的实例化

【例7-6内部类的实例化例子。

class Outerclass

{

   private static int number=100;

   class innerclass

   {

      private  int number=50;

      public  void print()

      {

         System.out.println("下面的index是内部类的:");

         System.out.println(this.number); // 访问内部类的成员

         System.out.println("下面的index是外部类的:");

         System.out.println(Outerclass.this.number);// 访问外部类的成员

      }

}

class Test

{

   public static void main(String []args)

   {

      Outerclass oc=new Outerclass();

      Outerclass.innerclass oi=oc.new innerclass();

   }

}

本例中定义了一个外部类Outerclass,在这个类中有一个内部类innerclass,在类Test中将内部类进行了实例化。

【例7-7可以在外部类中对内部类进行实例化,本例是对例7-6的一点改动。

class Outerclass

{

   private static int number=100;

   static class innerclass

   {

      private  int number=50;

      public  void print()

      {

         System.out.println("下面的index是内部类的:");

         System.out.println(this.number);

         System.out.println("下面的index是外部类的:");

         System.out.println(Outerclass.number);  //访问外部类的静态成员,

                                                   //非静态成员不可访问。

      }

   }

   public static innerclass Getinnerclass()

   {

      return new innerclass()

      {

      public void print()

      {

         System.out.println("这个内部类实例是一个匿名类!!");

         }

      };

   }

}

class Test

{  

   public static void main(String []args)

   {

      Outerclass oc=new Outerclass();

      Outerclass.innerclass oi=oc.Getinnerclass();

   }

}

上述两个内部类的实例化的最大区别是:第二个内部类是静态的,而第一个不是。静态内部类和非静态的内部类有以下两点区别。

1)静态内部类只能访问外部类的静态成员。

2)只有在静态内部类中,才能声明静态成员。

内部类除了可以声明为static类型的之外,还可以声明为finalabstract类型的。

2.内部类的继承

【例7-8内部类继承的例子。

class Outer

{

   class inner

   {

      inner()

      {

         System.out.println("内部类被派生了!");

   }

   }

}

class innerclasschild extends Outer.inner

{

   innerclasschild(Outer Outer)

   {

      Outer.super();

   }

}

class Test

{

   public static void main(String []args)

   {

      Outer o=new Outer();

      innerclasschild ic=new innerclasschild(o);

   }

}

在本例中,innerclasschild类由Outer的内部类innerclass派生,因此在innerclasshcild类的构造函数中就要接收一个Outer类型的参数,以通过该参数访问Outer的内部类。