内部类

  • 内部类是定义在类中的类,分为成员内部类,局部内部类,静态内部类 和匿名内部类

1.成员内部类

  • 成员内部类定义在类中的成员位置;
  • 成员内部类中的对象可以随心所欲的访问外部类的成员;
  • 成员内部类中的变量名如果和外部类中的变量名相同的话,会发生隐藏现象;this.变量名 访问的是内部类的变量; 外部类名.this.变量名; 访问的是外部类的成员变量;
  • 外部类的方法要访问内部类的成员时,需要创建对象,用对象去访问.
    Inner i=new Inner();
  • 在其他类去创建成员内部类对象时,需要提前创建一个外部类对象:
    外部类名.内部类名 对象名 = 外部类对象().内部类对象();
    Outter.Inner i = new outter.new Inner();

2.局部内部类

  • 局部内部类是定义在类的方法中的类
  • 局部内部类可以直接访问外部类的成员,包括私有;
  • 局部内部类访问局部变量时,需要加上final修饰,否则编译失败;
    (局部变量随着方法调用完毕而消失,而当前这个局部变量被局部内部类的对象访问,在堆内存中对象不会被立即回收,它还在继续使用这个局部变量,需要将这个变量定义为常量,常驻内存,以便局部内部类对象对该局部变量的访问)
  • 局部内部类类似成员变量,不可以加 public、protected、private 以及 static 修饰符
  • 外部类的方法如果要访问局部内部类的成员,依然要创建局部内部类的对象;
  • 其他类不能直接访问局部内部类,但是可以通过创建外部类对象,调用局部内部类所在的方法;

3.静态内部类

  • 静态内部类是成员内部类加上static 修饰符后的类

  • 静态内部类只能访问外部类的静态成员;

  • 同样静态变量和方法不可以定义在成员内部类中,但是可以定义在静态内部类中;

  • 静态内部类类似于静态方法,不需要依靠外部类的对象;在没有外部类对象的时候依然可以创建静态内部类对象

  • 其他类创建静态内部类的对象:
    外部类名.内部类名 对象名 = new 外部类名.内部类名() ;
    Outer.Inner i = new Outer.Inner() ;

4.匿名内部类

  • 匿名内部类是局部内部类的一种简化形式;
  • 匿名内部类是唯一一种没有构造器的类
  • 匿名内部类的语法:
    new 接口名(){
    重写方法;
    };
  • 其中接口名可以换成抽象类名;匿名内部类实际上是接口的子实现类的对象,使用匿名内部类可以省略子实现类;
  • 匿名内部类经常用于方法参数的传递,或者接口的方法重写并调用;

你可能感兴趣的:(JAVA)