内部类、匿名内部类、静态内部类

一、内部类(内置类、嵌套类)

        1、内部类的访问规则:内部类可以直接访问外部类的成员,包括私有(private)。
    之所以内部类可以直接访问外部类的成员,是应为内部类中持有了一个外部类的引用:外部类名.this

        2、外部类要访问内部类就必须要建立内部类对象。

        3、其他类要访问内部类中的方法有两种方式:

          1)、当外部类能访问到内部类的时候,使用外部类的对象名进行访问。
          2)、new一个内部类的对象:外部类名.内部类名 x = new 外部类名().new 内部类名()

        4、内部类定义在外部类的成员位置上,就可以被成员修饰符所修饰:private、static、等。
          1)、被private修饰: 此内部类就只能被其外部类建立对象 和 访问(在外部类中进行了封装)。
          2)、被static修饰:就成为了静态内部类(下文详讲)。


二、静态内部类(被static修饰)

        1、当内部类被static修饰后,就只能访问外部类中的静态成员了。

        2、其他类如何访问静态类:
          1)、当要访问静态类中的非静态成员时:new 外部类名.内部类名().内部方法名()
                        new  Outer.Inner().function()
          2)、当要访问静态类中的静态成员时 :外部类名.内部类名.内部方法名()
                        Outer.Inner.function()

      注意:当内部类中定义了静态(static )成员,那么 该内部类就必须是静态(static)的。
         当外部类中的静态(static)方法访问内部类时, 内部类也必须是静态(static )的。


三、使用条件

         当我们要描述的事物内部还有事物的时候,该事物用内部类来形容。 因为该内部事物在使用外部事物的内容。

四、当内部类定义在局部时

        1、因为不是在成员位置上,所以不能被成员修饰符所修饰(static、public等)
        2、还是可以直接访问外部类的成员,因为他还是持有外部类中的引用 : 外部类名.this
          但是他不能访问他所在局部的局部变量,但是可以被final修饰的局部变量。


五、匿名内部类:

        1、匿名内部类其实就是内部类的简写格式。

        2、定义匿名内部类的前提:
      内部类必须是继承一个类,或者实现接口。 (内部类可以继承外部其它类或者实现外部的接口)
      (举例:人的类里有一个人的心脏的类,人的心脏类可以继承自一个动物的心脏的抽象类)

        3、直接new一个以其父类或者接口名() 加大括号 复写其方法 的 子类对象, 后面直接加 . 来调用其方法
            父类或者接口名(){复写的子类内容}.复写的方法
     (直接在每个调用方法中做这个定义并调用,每次定义只能实现一次性调用)

      总结:匿名内部类其实就是一个匿名的子类的对象。

        4、匿名内部类中的方法不要超过3个,否则阅读性会比较差。
      匿名内部类中最好只要复写父类方法,不要定义新的方法,此举一般无意义
      因为:如果要给匿名内部类命名,就只能命一个父类的名字,因为多态的原因,其不能调用子类方法(无法定义子类名)。

原文地址:https://www.cnblogs.com/soficircle/p/6623947.html