首页 > 代码库 > 内部类总结

内部类总结

 

一。成员内部类:与类的成员变量一样

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;        }       。。。。。}