java内部类

1.成员内部类、局部内部类、匿名内部类和静态内部类

外部类访问权限:public 不修饰

成员内部类访问权限:private访问权限、protected访问权限、public访问权限及包访问权限

如果用protected修饰,则只能在同一个包下或者继承外部类的情况下访问;

成员内部类可以问外部类的所有成员属性和成员方法(包括private成员和静态成员),编译器会默认为成员内部类添加了一个指向外部类对象的引用,为内部类构造函数添加一个指向外部类对象的一个引用的参数

成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象;

内部类中的this指的是内部类的实例对象本身,如果要用外部类的实例对象就可以用类名.this的方式获得;

内部类对象中不能有静态成员,原因很简单,内部类的实例对象是外部类实例对象的一个成员。

2.局部内部类

局部内部类是定义在一个方法的类,它和成员内部类的区别在于局部内部类的不能设置访问权限;

局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的;

局部内部类不能访问定义它的方法内的局部变量,除非这个变量被定义为final;

3.匿名内部类

匿名内部类是唯一一种没有构造器的类

4.静态内部类

从前面可以知道,静态内部类是不依赖于外部类的,也就说可以在不创建外部类对象的情况下创建内部类的对象。另外,静态内部类是不持有指向外部类对象的引用的,这个读者可以自己尝试反编译class文件看一下就知道了,是没有Outter this&0引用的。

为什么局部内部类和匿名内部类只能访问局部final变量?

编译成两个类,就是两个不同变量,为了变量保持一致性,用final修饰

Java采用了 复制  的手段来解决这个问题

原文地址:https://www.cnblogs.com/lelouchKOP/p/5787524.html