一。成员内部类:与类的成员变量一样
1 可以加任意的修饰:private, protected,顶级类只可以为public, default
2 内部类不可脱离其外部类的限制使用,因此在外部类以外创建内部类要这样:
outerObject=new outerClass(Constructor Parameters); outerClass.innerClass innerObject=outerObject.new InnerClass(Constructor Parameters);
3 内部类对象可以访问外部类的任意变量或方法(包括private变量或方法),因为Java编译器在创建内部类对象时,隐式的把其外部类对象的引用
也传了进去并一直保存着.所以成员内部类和外部类的属性有相同的生命周期)
4 在内部类中,外部类与内部类同名的成员会被屏蔽, 不过可以这样访问外部的同名属性: OuterClass.this.field
5 非静态内部类不能有静态成员,因为它违背了成员类必须依赖外部类而存在的原则(静态成员在Class被load的时候就初始化了)
6 内部类可以实现一个外部接口或抽象类,外部类返回这样的一个接口,以达到隐藏接口的实现的目的。如JDK中List的Iterator,map接口实现使用
集合非静态内部类来实现它的集合视图
一。静态内部类:如同类的静态成员一样; 它和成员内部类的区别是它没有指向外部类的引用
1 创建静态内部类对象:
OuterClass.InnerClass obj = new OuterClass.InnerClass(params);
2 静态内部类可以有非静态成员
3 静态内部类只能访问外部类的静态成员
4 静态内部类的常见用法:作为辅助类,仅当与它的外部类一起使用时才有意义
5 私有静态内部类的常见用法:用来代表外围类所代表的对象的组件。例如:考虑一个Map实例,Map的实现里面有一个Entry对象。虽然每个Entry
都与一个Map关联,但entry上的方法(getKey,getValue,setValue)并不需要访问该Map。因此,使用非静态内部类来表示Entry是很浪费的:每个
Entry中将会包含一个指向该Map的引用 ,浪费了时间和空间。
三。局部内部类:方法体或者代码片断中定义的类
1 局部内部类前面不能有access修饰符(和定义局部变量一样)
2 它有它自己的作用域,超出了这个范围就无效
3 它可以访问外部类的所有成员(因为外部类的成员对该方法可见)
4 定义在方法体中的内部类只能访问该方法的final变量,原因:定义在方法体中的变量会随着方法的退出而消亡,通过定义其为final变量,可以扩展其生命期
5 定义在代码块中的内部类只能使用在该block中定义的final变量
四。匿名内部类:在某些情况下,我们只需要内部类的一个对象,而不需要该类的名字
1 匿名内部类的实例化:
new SomeInterfaceOrClass(){......};
意思是创造一个实现(继承)了SomeInterfaceOrClass的类的对象
2 定义匿名内部类的时候,如果用到外面的对象,需要把这个参数的引用声明成final的
五。附源码:
1.Entry
static class Entry<K,V> implements Map.Entry<K,V> { final K key; V value; Entry<K,V> next; final int hash; /** * Creates new entry. */ Entry(int h, K k, V v, Entry<K,V> n) { value = v; next = n; key = k; hash = h; } public final K getKey() { return key; } public final V getValue() { return value; } public final V setValue(V newValue) { V oldValue = value; value = newValue; return oldValue; } 。。。。。 }