内部类

Posted lxy522

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内部类相关的知识,希望对你有一定的参考价值。

内部类

分类:

1、成员内部类

格式:

修饰符 class 外部类名称{

  修饰符 class 内部类名称{

    //...

  }

  //...

}

注意:内用外,随意访问;外用内,需要内部类对象。

使用方式:

1、间接方式:在外部类的方法当中,使用内部类,然后main只是调用外部类的方法。

2、直接方式:

公式:外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称()

public class Body {
?
  public class Heart{//成员内部类
?
      public void beat(){//内部类方法
          System.out.println("心的跳动");
      }
  }
?
  public void method(){//外部类方法
      System.out.println("外部类的方法");
  }
}
public class Outer {
  int num = 10;//外部类的成员变量
?
  public class Inner{
      int num = 20;//内部类的成员变量
?
      public void method() {
          int num = 30;//内部类方法的局部变量
          System.out.println(num);//30,局部变量就近原则
          System.out.println(this.num);//20,内部类的成员变量
          System.out.println(Outer.this.num);//外部类的成员变量
      }
  }
}

2、局部内部类(包含匿名内部类)

/**
* @program: intellij idea
* @description:如果一个类是定义在一个方法内部的,那么这就是一个局部内部类。
* “局部”,只有当前所属的方法才能使用它,出了这个方法外面就不能用了。
* 定义格式:
* 修饰符 class 外部类名称{
*     修饰符 返回值类型   外部类方法名称(参数列表){
*         class 局部内部类名称{
*             //...
*         }
*     }
* }
* @author: lixy
* @create: 2020-04-30 17:40
**/
public class Outer {
  public void method(){
      class Inner{//局部内部类
          int num = 10;
          public void methodInner(){
              System.out.println(num);//10
          }
      }
      Inner inner = new Inner();
      inner.methodInner();
  }
}
public class Demo07Main {
  public static void main(String[] args) {
      Outer outer = new Outer();
      outer.method();
  }
}

匿名内部类

如果接口的实现类(或父类的子类)只需要使用唯一一次,那么这种情况下就可以省略掉该类型的定义,而改为使用 匿名内部类。

匿名内部类的定义格式:

接口名称 对象名 = new 接口名称(){

  //覆盖重写所有抽象方法

};

注意:

1、匿名内部类,在创建对象的时候,只能使用唯一一次。如果希望多次创建对象,而且类的内容一样的话,那么类的内容一样的话,那么就必须使用单独定义的实现类了。

2、匿名对象,在调用方法的时候,只能使用唯一一次。如果希望同一个对象调用多次方法,那么必须给对象起个名字。

3、匿名内部类是省略了实现类/子类名称,但是匿名对象是省略了对象名称。

注:匿名内部类和匿名对象不是一回事。

 

以上是关于内部类的主要内容,如果未能解决你的问题,请参考以下文章

片段 - 全局视图变量与本地和内部类侦听器和内存泄漏

为啥片段类应该是公开的?

ForegroundService没有从片段开始?

在内部片段类中使用ListView

自定义无内存泄漏的Handler内部类

底部导航 如何从片段内部更改片段