`
xyheqhd888
  • 浏览: 403681 次
  • 性别: Icon_minigender_1
  • 来自: 秦皇岛
社区版块
存档分类
最新评论

Java内嵌类

阅读更多

1.  类中还可以再定义类,称之为“内嵌类(Inner Class)或嵌套类(Nested)”。非静态的内嵌类可以分为3种:成员内嵌类(Member Inner Class)、区域内嵌类(Local Inner Class)与匿名内嵌类(Anonymous Inner Class)。内嵌类的主要目的不是对外部隐藏类的存在性。

2. 使用内嵌类的几个好处:其一是内嵌类可以直接存取其所在类中的私用成员;其二是当某个Slave类完全只服务于一个Master类时,可以将之设定为内部类,这样使用Master类的人就不用知道Slave的存在;再者,像在“静态工厂”(Static Factory)模式中,对调用静态方法的对象隐藏返回对象的实现细节或产生方式。

3. 成员内部类:可以使用public、protected、private来修饰其存取权限。文件管理方面,成员内嵌类在编译完成之后,所产生的文件名称为“外部类名称$内部类名称.class"。

4. 区域内嵌类:使用与成员内嵌类类似,区域内嵌类定义于一个方法中,类的可视范围与生成的对象仅限于该方法中。

5. 匿名内嵌类:匿名内嵌类可以不声明类名称,而使用new直接产生一个对象,它可以是继承某个类或是实现某个接口。其声明方式如下:

new [类或接口()]
{
   //实现
}

 

 一个示例如下:

   

public class AnonymoutClassDemo
{
    public static void main(String[] args)
       {
            Object obj = new Object() 
                  {
                       public String toString()  
                             {     //重新定义toString()
                                    return "匿名类对象";
                             }
                  };
             System.out.println(obj);
       }
}

      此示例直接继承Object类定义一个匿名类,重新定义了toString()方法。使用System.out.println()时如果传入的是对象,会调用对象的toString()方法得到String实例。输出如下:匿名类对象。

      注意:如果要在内嵌类中使用外部的区域变量,变量在声明时必须为final。

      如以下代码:

   

public void someMethod()
{
      int x = 10;    //应该声明为final
      Object obj = new Object()
         {
               public String toString()
                    {
                        return String.valueOf(x);  //若x不是final型的,则不可在匿名类中使用
                    }
         };
      System.out.println(obj);
}

     加final声明的原因:因为区域变量x并不是真正被拿来在内嵌匿名类中使用,x会被匿名类复制作为数据成员来使用。由于真正在匿名类中的x是复制器,即使在内嵌匿名类中对x作了更改,也不会影响到真正的区域变量x。编译器会提示您加上final关键词,这样就知道不能在内嵌匿名类中改变x的值,况且即使能改变也没有意义!

      在文件管理方面,内嵌匿名类在编译完成之后会产生"外部类名称$编号.class"

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics