Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8245346
  • 博文数量: 444
  • 博客积分: 10593
  • 博客等级: 上将
  • 技术积分: 3852
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-09 15:26
文章分类

全部博文(444)

文章存档

2014年(1)

2013年(10)

2012年(18)

2011年(35)

2010年(125)

2009年(108)

2008年(52)

2007年(72)

2006年(23)

分类: Java

2006-05-11 15:45:16

内部类
       内部类就是定义在其他类、方法、甚至表达式中的类,它的特点与一般的类并没有什么大的不同。Java语言有四种类型的内部类,下面分别介绍。

8.1 静态Static内部类
       静态内部类是定义在类内部的类,所以也称为嵌套类,并且使用static修饰符来声明。需要注意的是凡是内部类,其名字都不能和封装它的类名字相同。对于静态内部类来说,它只能访问其封装类中的静态成员(包括方法和变量)。

       静态内部类示例如下:

CODE:
    package mypackage;

    public class EnclosiongClass {

       private static int staticvar = 0;

       public int instancevar = 0 ;

      

       public static class StaticInnerClass {

       }

    }
8.2 成员Member内部类
       成员内部类与静态内部类相似,也是定义在类内部这一级,只是它不使用static修饰符来声明。所以它和类中的其他实例变量一样,都可以看作是其封装类中的成员。它可以访问其封装类中的任何成员。需要注意的是,在成员内部类中不能定义有static变量,但是可以使用局部变量。

       由于成员内部类是非static的,所以在创建内部类的实例时,必须有一个其封装类的实例引用。可见下面的例子:

CODE:
       public class EnclosingClass {

       private int instVar = 1;



       public class MemberClass {

           public void innerMethod {

              // it is okay to do something with instVar here

           }

       }



       public MemberClass createMember () {

           return this.new MemberClass ();

       }

    }
这里是在封装类内部创建内部类的实例,实际这个this可以不显式使用,系统会自行隐式使用来引用封装类的实例。如果对于在封装类外部来创建内部类的实例,依然必须要有一个封装类的实例引用。其语法有两种,可分别见下面的两个示例:

EnclosingClass ec = new EnclosingClass ();

EnclosingClass.MemberClass mc = ec.new MemberClass();

或者

EnclosingClass.MemberClass mc = new EnclosingClass ().new MemberClass ();

    另外还需要提一下的是this和super在内部类中使用所代表的意义,this是指的该内部类的实例引用,而super是指的其封装类的实例引用。所以大家在使用这两个关键字的时候一定要注意它所处的位置。

8.3 局部Local内部类
       局部内部类是定义在方法体或更小的语句块中的类。它的使用如同方法体中的局部变量,所以你不可以为它声明访问控制修饰符。同成员内部类相同,也不可以含有static成员。这里需要注意的是,在局部内部类和后面将介绍的匿名内部类中可以引用方法中声明的变量,但这些变量必须是final的。

8.4 匿名Anonymous内部类
       在某些时候,你可能需要定义一个类,但在程序中却从来不会定义它的对象,只是用来把这个类的对作为自变量直接传递给方法,这时就使用匿名类。如下的例子:

       pickButton.AddActionListener ( new ActionListener ( )

                         {

                            //Code to define the class that implements

//the ActionListener interface

                          }

                         )

    匿名类总是用来扩展一个现有的类,或者实现一个接口。它没有名字,所以也没有构造函数,并且也没有任何修饰符来声明它。

    一般来说,匿名类经常用于AWT和Swing中的事件处理。
阅读(1300) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~