内部类详解

内部类分为:成员内部类,局部内部类,匿名内部类,静态内部类

成员内部类

形式:


public class A {
String s;
class B{
}
}

例子:

public class Test {
  class B{
      int a=1;
        void a(){
            System.out.println("111");
        }
  }
}

class C{
  public static void main(String[] args) {
      Test.B b=new Test().new B();
      b.a();
      System.out.println(b.a);
  }


}

实例化B的方式为Test.B b=new Test().new B();B会持有A对象的引用,所以鉴于这点,引出java中的内存泄漏问题

局部内部类

形式:

public class Test {
void a(){
  class C{
       
  }

  }
}

局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。

匿名内部类

形式:

public class Test {
  public static void main(String[] args) {
      new C(){
           
      };
  }
}
class C{
   
}

例子:

public class Test {
  public static void main(String[] args) {
      new Thread(){
          @Override
          public void run() {
              System.out.println("111");
          }
      }.start();
  }
}

静态内部类

形式:

public class Test {
static class C{
   
}
}

把前面的成员内部类拿过来,前面加个static就行了

例子:

public class Test {
static class C{
int a=1;
}
}
class D{
  public static void main(String[] args) {
      Test.C c=new Test.C();
      System.out.println(c.a);
  }
}

B也不会再持有A的对象引用,所以将内部类改为static能解决内存泄漏这个说法原因是在这。

内部类命名规则

内部类会在编译的时候产生相对应的class文件,非匿名内部类类名规则为 OutClass$InnerClass,匿名内部类类名则为OutClass$数字

ps:用局部内部类和匿名内部类时,都要求局部变量为final

原因:

public static void main(String[] args) {
  final int a=10;
  new Thread(){
      @Override
      public void run() {
          System.out.println(a);
      }
  }.start();
}

在变量a生命周期结束的时候,线程生命周期很可能没结束,此时访问的a必须被final修饰

 

posted @ 2020-05-16 12:58  坚持_第一天  阅读(228)  评论(0)    收藏  举报