局部内部类
局部内部类不能有访问说明符,因为不是外围类的一部分,但是可以访问当前代码块内的常量,以及此外围类的所有成员。 局部内部类的名字在方法外是不可见的,为什么仍然使用局部内部类而不是匿名内部类呢?唯一理由是:需要一个已命名的构造器,或者需要重载构造器,而匿名内部类只能用于实例初始化。
package com2002;
/**
* Created by Panda on 2018/6/11.
*/
interface Counter{
int next();
}
public class LocalInnerClass {
private int count=0 ;
Counter getCounter(final String name){
class LocalCounter implements Counter{
public LocalCounter (){
System.out.println("localCounter()" );
}
@Override
public int next () {
System.out.println(name);
return count++;
}
}
return new LocalCounter();
}
Counter getCounter2(final String name){
return new Counter() {
{
System.out.println("Counter()" );
}
@Override
public int next () {
System.out.println(name);
return count++;
}
};
}
public static void main (String[] args) {
LocalInnerClass localInnerClass=new LocalInnerClass();
Counter counter1=localInnerClass.getCounter("local inner" );
Counter counter2=localInnerClass.getCounter2("Anonymous inner" );
for (int i = 0 ; i <5 ; i++) {
System.out.println(counter1.next());
}
for (int i = 0 ; i < 5 ; i++) {
System.out.println(counter2.next());
}
}
}
内部类标识符
每个类都会产生一个.class文件,其中包含了如何创建该类型的对象的全部信息。内部类也必须生成一个.class文件以包含它们的Class对象信息。这些类文件的命名有严格的规则:外围类的名字,加上”$”,再加上内部类的名字。 如果内部类是匿名的,编译器会简单地产生一个数字作为其标识符。如果内部类是嵌套在别的内部类之中,只需直接将它们的名字加在其外围类标识符与“$”的后面。