Java基础 内部类

“简单不先于复杂,而是在复杂之后.” —— Alan Perlis

s.jpg

内部类

  • 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。内部类是一种非常有用的特性,因为它允许你把一些逻辑相关的类组织在一起,并控制位于内部的类的可视性。

广泛意义上的内部类一般分为以下几种类型:

  • 成员内部类
    最普通的内部类,它定义在另一个类的内部,如下所示
//外部类
class Out {
  private int age = 12;

  //内部类
  class In {
      public void print() {
          System.out.println(age);
      }
  }
}

public class NormalInnerClass {
    public static void main(String[] args) {
        Out.In in = new Out().new In();
        in.print();
        //或者采用下种方式访问
        /*
        Out out = new Out();
        Out.In in = out.new In();
        in.print();
        */
    }
}

  • 局部内部类
    局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
interface extendInnerClass{
    public int setAge();
}

//外部类
class Out {
  private int age = 12;

  public extendInnerClass getInnerClass(){
      // 局部内部类
      class innerClass implements extendInnerClass{
          public int setAge(){
              age++;
              return age;
          }

      }
      return new innerClass();
  }
}

public class NormalInnerClass {
    public static void main(String[] args) {
        Out out = new Out();
        System.out.println(out.getInnerClass().setAge());
    }
}
注意,局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。

静态内部类

class Out3 {
    private static int age = 12;

    static class In {
        public void print() {
            System.out.println(age);
        }
    }
}

public class staticInnerClass {
    public static void main(String[] args) {
        Out3.In in = new Out3.In();
        in.print();
    }
}

可以看到,如果用static 将内部内静态化,那么内部类就只能访问外部类的静态成员变量,具有局限性

其次,因为内部类被静态化,因此Out.In可以当做一个整体看,可以直接new 出内部类的对象(通过类名访问static,生不生成外部类对象都没关系)

  • 匿名内部类
匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。匿名内部类在编译的时候由系统自动起名为Outter$1.class。一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 内部类将一些逻辑相关的类组织在一起,并控制位于内部类的可视性 为什么需要内部类 每个内部类都能独立地继承一个(接口...
    陈晨_Fly阅读 267评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,740评论 18 399
  • 记笔记是个好习惯,而我一直没有,以后一定要慢慢养成这个习惯。内部类其实就是定义在一个普通外部类内部的类,基本的结构...
    没想到我也能写代码阅读 157评论 0 1
  • 1.内部类的概述: 把类定义在另一个类的内部,该类就被称为内部类. 举例:把类B定义在类A中,类B就被称为内...
    王子也寂寞阅读 323评论 0 0
  • 1 她听见沉重的叹息,像涨潮的声音。月光穿过光秃秃的窗棂,投射进来,被切割的月光于是有了一种极不真切、残缺的美。 ...
    每个好孩子都有糖吃阅读 363评论 2 1