zoukankan      html  css  js  c++  java
  • 内部类总结

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

    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;
            }
           。。。。。
    }
  • 相关阅读:
    Attributes in C#
    asp.net C# 时间格式大全
    UVA 10518 How Many Calls?
    UVA 10303 How Many Trees?
    UVA 991 Safe Salutations
    UVA 10862 Connect the Cable Wires
    UVA 10417 Gift Exchanging
    UVA 10229 Modular Fibonacci
    UVA 10079 Pizza Cutting
    UVA 10334 Ray Through Glasses
  • 原文地址:https://www.cnblogs.com/yuyutianxia/p/3839840.html
Copyright © 2011-2022 走看看