1-1 Java内部类概述

       (1)内部类:顾名思义,定义在一个类内部的类就是内部类。InnerClass对应其外部的就是外部类OuterClass。

        (2)Java内部类种类成员内部类静态内部类局部内部类(方法内部类)匿名内部类。

        (3)内部类的四大特点

          a)提供更好的封装:可以被public,default,protected和private访问修饰符修饰(而外部顶级类即类名和文件名相同的只能使用public或default)。

          b)访问外部类数据无限制内部类的方法可以直接访问外部类的所有数据,包括私有数据。

          c)外部类不能直接访问内部类的数据:必须先创建内部类的对象,再通过此对象进行访问。

          d)解决一些问题间接实现多重继承避免修改接口而实现同一个类中两种同名方法的调用问题

        (4)注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。编译完成后出现Outer.class和Outer$Inner.class两类。所以内部类的成员变量/方法名可以和外部类的相同。


1-2 成员内部类(普通内部类)

            a)定义在外部类的内部,相当于外部类的一个成员变量

                  Inner类可以使用任意的访问控制符修饰。一般用private修饰。

            b)Inner 类中定义的方法可以直接访问 Outer 类中的数据,而不受访问控制符的影响。

            c)new一个内部类对象必须使用外部类对象来创建内部类对象即:外部类.内部类 内部类对象名 = 外部类对象.new 内部类( );

            d)外部类是不能直接使用内部类的成员和方法-可先创建内部类的对象,然后通过内部类的对象来访问其成员变量和方法。

                注意:外部内的静态方法里无法对内部类进行实例化。

            e)如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,可以使用 this 关键字:外部类名.this.属性/方法

            f)成员内部类的一些限制:成员内部类不能与外部类重名。不能在成员内部类中定义static属性,方法和类(static final常量除外)。

           g)内部类里面还能嵌套内部类

             h)把接口看成特殊类,故也存在内部接口 

wKioL1WjW-ah4iFIAAPBqFSZhL8507.jpg


1-3 静态内部类(被static修饰的普通内部类)

            a)静态内部类和外部类没有任何关系,只是在生成类名和类定义时有影响。可以把静态内部类看成与外部类平级的类。使用方法与外部类平级的类完全一样。

            b)创建静态内部类的实例:外部类.内部类 内部类对象名 = new 外部类名.内部类名( );

            c)注意:成员内部类不能与外部类重名,静态内部类不能访问外部类的非静态属性和方法。外部类不能访问内部类的非静态属性和方法。

            d)如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,不需使用 this 关键字:外部类名.属性/方法

             e)静态内部类里面还能其他静态内部类:嵌套静态内部类

             f)什么时候用静态内部类?==> 当B为A的辅助类,且只为A所用时,可将B定义为A的静态内部类。


1-4 匿名内部类

        (1)匿名内部类的特点:

             a)匿名内部类是没有名称的内部类,没有办法引用它:必须在创建时作为new语句的一部分来声明并创建它们的实例。

             b)匿名内部类必须继承一个类(抽象的,非抽象的都可以)或者实现一个接口。若父类(或者父接口)是抽象类,则匿名内部类必须实现其所有抽象方法。

             c)匿名内部类可以定义代码块(代码块优先于构造方法先执行),用于实例初始化。但不能是静态代码块。
        (2)匿名内部类语法: new interface /superclass(){//类体};

 

                   声明了一个新的匿名类,它对一个给定的类进行了扩展,或者实现了一个给定的接口,并且同时创建了此匿名类的一个新实例。


1-5 方法内部类
        (1)方法内部类(局部内部类)的特点:

            a)定义在外部类的方法中,故它只有在此方法体内部可见,只能在方法体内部实例化

            b)方法内部类不能使用访问控制符和static修饰符