代码改变世界

Java内部类

2018-01-11 21:41  Gizing  阅读(249)  评论(0编辑  收藏  举报

以下是个人对Java内部类的一些认识,如有错误地方,欢迎大家指出,感谢!

内部类是定义在一个类中的类

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

内部类好处

内部类完善多重继承,即一个类A虽然可以实现多个接口,但是只能继承一个类或抽象类。但是可以让类A的多个内部类分别继承多个类或抽象类,从而实现多重继承。

成员内部类

  • 作为外部类的成员变量,外部类要访问内部类的所有成员变量/方法,需要通过内部类的对象来获取
  • 成员内部类不能含有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();
    
  • 作为外部类的成员变量,不能放在方法中