• 内部类总结


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

    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;
            }
           。。。。。
    }
  • 相关阅读:
    angularjs中ng-repeat-start与ng-repeat-end用法实例
    随笔 javascript-抽象工厂模式
    VMware一些使用心得
    oracle 12c的数据库导进 11g
    架构师基本功:消息队列
    如何提高工作效率
    oracle 12c 13姨
    架构师基本功:SOA
    autofac如何注册静态方法里的接口对象
    发布Java桌面程序
  • 原文地址:https://www.cnblogs.com/yuyutianxia/p/3839840.html
Copyright © 2020-2023  润新知