1.成员内部类、局部内部类、匿名内部类和静态内部类
外部类访问权限:public 不修饰
成员内部类访问权限:private访问权限、protected访问权限、public访问权限及包访问权限
如果用protected修饰,则只能在同一个包下或者继承外部类的情况下访问;
成员内部类可以问外部类的所有成员属性和成员方法(包括private成员和静态成员),编译器会默认为成员内部类添加了一个指向外部类对象的引用,为内部类构造函数添加一个指向外部类对象的一个引用的参数
成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象;
内部类中的this指的是内部类的实例对象本身,如果要用外部类的实例对象就可以用类名.this的方式获得;
内部类对象中不能有静态成员,原因很简单,内部类的实例对象是外部类实例对象的一个成员。
2.局部内部类
局部内部类是定义在一个方法的类,它和成员内部类的区别在于局部内部类的不能设置访问权限;
局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的;
局部内部类不能访问定义它的方法内的局部变量,除非这个变量被定义为final;
3.匿名内部类
匿名内部类是唯一一种没有构造器的类
4.静态内部类
从前面可以知道,静态内部类是不依赖于外部类的,也就说可以在不创建外部类对象的情况下创建内部类的对象。另外,静态内部类是不持有指向外部类对象的引用的,这个读者可以自己尝试反编译class文件看一下就知道了,是没有Outter this&0引用的。
为什么局部内部类和匿名内部类只能访问局部final变量?
编译成两个类,就是两个不同变量,为了变量保持一致性,用final修饰
Java采用了 复制 的手段来解决这个问题