java内部类总结

1000阅读 0评论2014-08-02 lt6419
分类:Java

内部类:
  定义:
  定义在另外一个类中的类,就是内部类。
  编译后生成的两个独立的类: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了一个内部类的对象

   总结:      
   匿名内部类属于局部内部类,那么局部内部类的所有限制都对其生效。
   匿名内部类是唯一一种无构造方法的类,因为构造器的名字必须和类名相同,而匿名内部类没有类名。
上一篇:u-boot系统启动流程分析
下一篇:Java多态详解