Chinaunix首页 | 论坛 | 博客
  • 博客访问: 537218
  • 博文数量: 181
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1498
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-22 15:17
个人简介

用发呆的时间来理清自己的思绪

文章存档

2015年(7)

2014年(134)

2013年(40)

分类: Java

2014-08-02 16:57:08

内部类:
  定义:
  定义在另外一个类中的类,就是内部类。
  编译后生成的两个独立的类:Outer.class 和Outer$Inner.class。
 
 内部类的分类:
   一、静态内部类:静态内部类定义在类中,任何方法外,用static修饰(属于类,不需要创建对象就可以使用,因为在加载.class文件的时候就已经加载到了内存的静态区了)
   静态内部类只能访问外部类的静态成员。(原因同上)
   创建静态类对象的方法,分两种情况:
    1. 在外部类的外部,要创建一个静态内部类对象不需要外部类对象:
    Outer.Inner in = new Outer.Inner();
    注意:此时的类,仍然是一个类的成员,因此类名应该以类名.成员的格式去写,外部类名.内部类名 in = new 外部类名.内部类名
    2. 在本类内部生成内部类对象的方式:
    Inner in = new Inner();
 
    二、成员内部类:作为外部类的一个成员存在,与外部类的属性、方法并列(首先是一个成员,然后这个成员是一个类)
    在内部类中可以直接访问外部类的私有属性。
    内部类和外部类的实例变量允许命名冲突。
    在内部类中访问实例变量:this.属性
    在内部类访问外部类的实例变量:外部类名.this.属性
   创建成员内部类对象的方法,分两种情况:
   1. 在外部类的外部,要创建一个成员内部类对象,要首先建立一个外部类对象,然后再创建一个成员内部类对象。
    Outer out = new Outer();
    Outer.Inner in = out.new Inner();
   2.在本类内部生成内部类对象的方式:
      1)在静态方法中:Inner in = new Outer().new Inner();
      2)在非静态方法中:Inner in = this.new Inner();
           成员内部类不可以有静态成员,这是因为静态属性是在加载类的时候创建,这个时候内部类还没有被创建。
   
   三、局部内部类:在外部类的方法中定义的内部类
   与局部变量类似,在局部内部类前不可以加修饰符public和private,其作用域为定义它的代码块。
   局部内部类不仅可以访问外部类的实例变量,还可以访问外部类的局部变量,但要求外部类的局部变量必须为final的。
   配合接口使用,来做到强制弱耦合。
   在外部类的外部不可创建局部内部类对象,只能在局部内部类所在的方法中创建:
    Inner in = new Inner();
   
  四、匿名内部类:一种特殊的局部内部类
   没有名字,也没有class、extends、implements关键字
   
   条件:已定义接口或类(用匿名内部类实现接口或者继承该类并且重写父类的方法)
   作用:用一种隐含的方式实现一个接口或继承一个类,并且只能创建一次实例
   实现方式:在某个语句中,new 父类/父接口名字(){ 类体中实现方法 }
    例如:
     TreesSet ts = new TreeSet(new Comparator(){
      public int compare(Object o1, Object o2){
       return 0;
      }
     }); ---new Comparator(){} 包括两步:1.定义一个内部类实现接口或继承父类,2.new了一个内部类的对象

   总结:      
   匿名内部类属于局部内部类,那么局部内部类的所有限制都对其生效。
   匿名内部类是唯一一种无构造方法的类,因为构造器的名字必须和类名相同,而匿名内部类没有类名。
阅读(900) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~