一、 Java内部类分类:

1.非静态成员内部类:

内部类没有使用static关键字修饰,并且和外部类的成员变量和方法属于同一级别,这样的是非静态成员内部类(可以使用权限修饰符修饰,和final、abstract关键字修饰)。

public class Atest {
   private String name = "张三";
   //类没有用static修饰
   class Btest{
       public void say(){
           System.out.println("我是非静态成员内部类");
       }
   }
}

2.静态成员内部类:

内部类使用static关键字修饰,并且和外部类的成员变量和方法属于同一级别,这样的是静态成员内部类(可以使用权限修饰符修饰,和final、abstract关键字修饰)。

public class Atest {

  public static String name = "张三";
  public String age = "23";
  
  static class Btest{
      public void say(){
          System.out.println("外部成员变量,name = " + name);
          System.out.println("我是静态成员内部类");
//            不可以调用非静态
//            System.out.println("外部成员变量,age = " + age);
      }
  }
}

3.局部内部类:

定义在一个类的成员方法、代码块、构造器内部的类,这样的类成为局部内部类(不能使用权限修饰符修饰局部内部类)。

public class Atest {
 
 public void execute(){
     class Dtest{

     }
 }
}

4.匿名内部类:

匿名内部类是没有类名的类,是特殊的局部内部类。
匿名内部类需要实现接口或是继承一个抽象类,此外匿名内部类不能定义构造器,因为是匿名
局部内部类实现接口:

public class Atest {

  public static String name = "张三";
  public String age = "23";
  

  public void execute(){
      class MyInterface implements TestInterface{

          @Override
          public void play() {
              System.out.println(name + "在打篮球");
          }
      }
  }

}
interface TestInterface{
  void play();
}

可以简化成匿名内部类:

public class Atest {

    public static String name = "张三";
    public String age = "23";


    public void execute(){
        TestInterface myInterface = new TestInterface(){

            @Override
            public void play() {
                System.out.println("这是匿名内部类");
            }
        };
        myInterface.play();
    }

}
interface TestInterface{
    void play();
}

二、 内部类如何实例化:

1.实例化非静态成员内部类:

public class Atest {

    public static String name = "张三";
    public String age = "23";


    class Btest{

        public void say(){
            System.out.println("测试非静态成员内部类实例化");
        }
    }

}
public class MainTest {

    public static void main(String[] args) {
        //非静态成员内部类实例化
        //1.实例化外部类
        Atest atest = new Atest();
        //2.实例化内部类
        Atest.Btest btest = atest.new Btest();
        btest.say();
    }
}

2.实例化静态成员内部类:

public class Atest {

  public static String name = "张三";
  public String age = "23";


  static class Ctest{

      public void say(){
          System.out.println("测试静态成员内部类实例化");
      }
  }

}
public class MainTest {

    public static void main(String[] args) {
        //静态成员内部类实例化
        Atest.Ctest ctest = new Atest.Ctest();
        ctest.say();
    }
}

三、 内部类如何调用外部类属性与方法:

public class Atest {

    public static String name = "张三";
    public String age = "23";


    class Btest{
        public String age = "22";

        public void say(String age){
            System.out.println("我是输出的形参参数,age = " + age);
            System.out.println("我是输出的Btest类成员变量,age = " + this.age);
            System.out.println("我是输出的Atest类成员变量,age = " + Atest.this.age);
        }
    }

}

执行主方法:

public class MainTest {

    public static void main(String[] args) {
        //静态成员内部类实例化
        Atest atest = new Atest();
        Atest.Btest btest = atest.new Btest();
        btest.say("18");
    }
}

输出结果:

我是输出的形参参数,age = 18
我是输出的Btest类成员变量,age = 22
我是输出的Atest类成员变量,age = 23