Java - 内部类

内部类分为四类:

1. 普通内部类

在类里创建一个普通类

public class InnerClassTest{

  public class InnerClassA{

  }

}

 

在这里InnerClassA作为InnerClassTest的普通内部类,相当于外部类的一个成员字段。这种情况下,创建内部类对象时要先创建外部类对象,比如创建InnerClassA的对象: 

InnerClassTest innerClassTest = new InnerClassTest();

InnerClassA innerClassA = innerClassTest.new InnerClassA();

此时内部类对象可以访问外部类对象,外部类对象也可以通过内部类的引用来访问内部类的对象。

2. 静态内部类

在类里创建一个静态类

public class InnerClassTest{

  public class StaticInnerClassA{

  }

}

 

因为一个类的静态成员独立于这个类的任何一个对象存在,在具有访问权限的情况下,我们都可以通过类名.静态成员名来访问。同理,静态内部类也是作为外部类的静态成员,创建一个类的静态对象类不需要依赖于外部类对象。比如常见InnerClassTest对象:

InnerClassTest.StaticInnerClassA staticInnerClassA = new InnerClassTest.StaticInnerClassA();

此时静态内部类是无法访问外部类的非静态成员,因为外部类的非静态成员是属于外部类对象的,而静态类独立于对象,所以静态内部类不能访问外部类的非静态成员。 外部类可以访问静态内部类的对象。

3. 匿名内部类

在方法参数中新建一个接口或者类对象,并实现这个接口声明或者类中已有的方法。

public class InnerClassTest{

  interface OnClickListener{

    void onClick(Object obj);

  }

  private void anonymousClassTest{

    OnClickListener onclickListener = new OnClickListener(){

      @override

      public void onClick(Object obj){

       //to do

      }

    }

    onclickListener.onClick(new Object(){

    @override

    public String toString(){

      return "object";

    }

    });

  }

}

 

此时匿名内部类中可以使用外部类的属性,但是外部类无法访问匿名内部类的属性,因为外部类无法找到匿名内部类的类名。

4. 局部内部类

声明在一个方法体浊者一段代码块中

public class InnerClassTest{

  private void partInnerClassTest{

    class A{

    }

    A a = new A();

    if(true){

      class B{

      }

      B b = new B();

    }

   // B b = new B(); can't use

  }

}

 

局部内部类只在当前块里起作用,出了代码块,该局部内部类就失效了。同理,局部内部类可以访问外部类对象,但外部类无法访问局部内部类对象。

=========================================================

内部类嵌套:内部类定义内部类

1. 普通内部类:可以嵌套普通内部类、匿名内部类、局部内部类,不可以嵌套静态内部类。

2. 静态内部类:可以嵌套普通内部类、静态内部类、匿名内部类、局部内部类。

3. 匿名内部类:定义方式同普通内部类。

4. 局部内部类: 定义方式同匿名内部类。

 

posted @ 2018-10-22 16:36  我是个神经病  阅读(163)  评论(0编辑  收藏  举报