Java内部类

来源:互联网 发布:北航网络教育好毕业吗? 编辑:程序博客网 时间:2024/06/06 08:25

内部类是定义在一个类中的类
- 内部类可对同一个包中的其他类隐藏起来
- 定义一个回调函数且不想编写大量代码时,匿名内部类比较便捷
- 内部类既可以访问自身的数据域和方法,也可以访问创建它的外部类的所有数据域和方法
- 只有内部类可以是私有类(private),而常规类只能是包可见性(默认,什么都没写)或公有可见性(public)
- 只有内部类才能声明为static

成员内部类

  • 作为外部类的成员变量,外部类要访问内部类的所有成员变量/方法,需要通过内部类的对象来获取
  • 成员内部类不能含有static的变量和方法。因为成员内部类需要先创建了外部类,才能创建它自己
  • 在成员内部类要引用外部类对象时,使用outer.this来表示外部类对象

局部内部类

  • 类定义在方法中,不能用public或private声明,作用域限定在此方法中,外部类的其他代码也无法访问
  • 除了能访问外部类,还能访问此方法的局部变量,不过这些局部变量必须是final

    public void start(int a, final boolean flag){    class Inner    {        public void action()        {            System.out.println(flag);        }    }    Inner inner = new Inner();    inner.action();    System.out.println(a);}

匿名内部类

  • 只创建这个类的一个对象,不必命名(没有类名
  • 由于构造器的名字和类名相同,而匿名类没有类名,所以匿名类不能有构造器
  • 匿名内部类的this指的是匿名内部类自身,要获得外部类的引用:outerClass.this,其中outerClass为外部类的类名
public void start(int interval, final boolean beep){    ActionListener listener = new ActionListener() //类定义直接跟在接口后面    {        public void action()        {            //do something        }    };    listener.action();}public void execute(){    // an object of an inner class extending Person class    Person count = new Person("lala"){...}}

静态内部类

  • 只是为了把一个类隐藏在另一个类的内部,不能引用外部类里的对象(只能访问外部类的静态数据域和方法)
  • 生成一个静态内部类不需要外部类

    Outer.Inner in = new Outer.Inner();
  • 作为外部类的成员变量,不能放在方法中

0 0