内部类

一、内部类
  • 定义:将类写在 其他类 (外部类)的内部。可以写在成员位置、局部位置。
  • 使用场景:在描述事物时,若一个事物内部,还包含其它可能还包含的事物。
    • 例如:汽车中包含发动机,此时发动机就可以用内部类描述。
  • 分类:成员内部类,局部内部类、匿名内部类,静态内部类。
  • 内部类编译的特点:(OuterClass 外部类 InnerClass 内部类)
    • 对一个外部类来说,在编译成功后,会出现两个Class文件。一个是 OuterClass.class ,另一个是 OuterClass$InnerClass.class 文件
  • 内部类访问特点:
    • 内部类 可以直接访问外部类的成员
    • 外部类 要访问内部类,必须要建立内部类对象。否则不可访问。
  • 成员内部类
 1 public class OuterClass {
 2     
 3     class InnerClass01{
 4         //成员内部类
 5     }
 6     
 7     {
 8         class InnerClass02{
 9             //局部内部类1
10         }
11     }
12     
13     void method(){
14         class InnerClass02{
15             //局部内部类2
16         }
17     }
18     
19 }

 

    • 实例化方法:
      • 方式一:在外部类的内部 :内部类 对象名 = new 内部类(实参列表);
      •  InnerClass innerClass = new InnerClass("InnerClass");
         innerClass.show("调用内部类");
        //在外部类内部

         

      • 方法二:在外部类的外部 :外部类.内部类 对象名 = new 外部类(实参列表).new 内部类(实参列表)
      • 1 OuterClass.InnerClass innerClassss = new OuterClass().new InnerClass("方式二创建");
        2 innerClassss.show("内部类局部变量");
        //在外部类外

         

    • 注意事项:
      • 内部类不能定义静态代码块
  • 局部内部类
    • 定义位置:定义在外部类方法体中的局部位置,与访问方法中的几部变量相似,可以通过调用方法进行访问。局部内部类还可以写在外部类的代码块中
    • 明确:局部内部类时,可以将内部类当作局部变量来理解。
  • 匿名内部类
    • 没有类名的一种内部类 属于局部内部类的一种形式。
    • 使用前提:必须要继承或者实现。
    •  1 //抽象类
       2 abstract class csAnimal {
       3     public abstract void eat();
       4     public abstract void eata();
       5 
       6     public abstract void all();
       7 
       8 }
       9 //方式二。通过定义匿名内部类来实现
      10         csAnimal bird2 = new csAnimal() {
      11             @Override
      12             public void eat() {
      13                 System.out.println("匿名内部类实现的小鸟在吃东西。。。。。");
      14             }
      15 
      16             @Override
      17             public void eata() {
      18 
      19             }
      20 
      21             @Override
      22             public void all() {
      23 
      24             }
      25 
      26         };
      27         bird2.eat();
      28         bird2.eata();
      29 
      30 
      31 
      32         //方式三、通过 匿名对象+匿名内部类 来实现
      33         new csAnimal() {
      34             @Override
      35             public void eat() {
      36                 System.out.println("匿名内部的另外一种写法。。。。。");
      37             }
      38 
      39             @Override
      40             public void eata() {
      41                 System.out.println("ttttttttttttt。。。。。");
      42             }
      43 
      44             @Override
      45             public void all() {
      46                 eat();
      47                 eata();
      48             }
      49         }.all();

       

  • 静态内部类
    • 定义:关键字 static 修饰的内部类 就叫做静态内部类。
    • 明确:将静态内部类,看做静态变量理解。
    • 语法:
      • 【修饰符】class 外部类名{
          【修饰符】static class 内部类名{
          //类体
        }
      }
    • 静态内部类的创建方式:
      • 方式一:在外部类的内部
        • 内部类 对象 = new 内部类(实参列表);
      • 方式二:在外部类的外部
        • 外部类.内部类 对象名 = new 外部类的.内部类(实参列表);
posted @ 2022-07-14 21:31  yuedongfan  阅读(36)  评论(0)    收藏  举报