关于内部类

内部类

内部类:定义在一个类内部的类。

它可以在定义在一个类中的属性的区域,或方法中,或一个代码块中(if,for)

内部类可以有名称,可以没有名称(匿名内部类)

匿名内部类多用于抽象类或接口的实例化(抽象类和接口本身是不能创建对象的,不能实例的,但是可以通过匿名内部类间接实现)

内部类的优点:它可以具有类的功能,但是只限于当前类使用,不对外,否则就定义成一个外部的类。

内部类可以绕开Java的类的单继承,如果外部类继承了一个类,而此时还想继承另一个类,就让内部类来继承它。

两点:别人不用,自己用(所以是内部类);内部类可以定义成方法来使用,但方法有局限性,当一个方法完成不了时,需要定义成一个类,方法升级为内部类后,功能增强。可以组织代码,使的代码结构清晰。

分类 :

1.成员内部类

2.方法内部类

3.块内部类

4.匿名内部类

public class Outer {
   int id = 1;
   /**
    * 成员内部类
    */
   class Inner1{
       public void say(){
           System.out.println("Inner1.say");
      }
  }

   public static void main(String[] args) {
       Outer outer = new Outer();
       // 访问类的成员
       System.out.println(outer.id);
       // 创建内部类的实例,需要外部类的实例
       Outer.Inner1 inner1 = new Outer().new Inner1();
       inner1.say();
  }
}
/**
    * 静态成员内部类
    */
   static class Inner2{
       public void say(){
           System.out.println("Inner2.say");
      }
  }
main:
     Outer.Inner2 inner2 = new Outer.Inner2();
       inner2.say();

内部类可以访问外部类的数据(注意静态的使用,如果内部类是静态的,则情况复杂)

静态内部类只能访问外部类的静态数据


public class Outer {
   int id = 1;
   /**
    * 成员内部类
    */
   class Inner1{
       public void say(){
           System.out.println("Inner1.say");
           System.out.println("Outer.id=" + id);
      }
  }

   /**
    * 静态成员内部类
    */
   static class Inner2{
       public void say(){
           System.out.println("Inner2.say");
           //System.out.println("Outer.id=" + id);
      }
  }
   public void work(){
       /**
        * 方法内部类,只能在方法内部使用
        */
       class Inner1{
           public Inner1(){
               System.out.println("method work Inner1 created");
          }
           void work(){
               System.out.println("method Inner1.work");
          }
      }
       Inner1 inner1 = new Inner1();
       inner1.work();
  }
   public static void main(String[] args) {
       Outer outer = new Outer();
       // 访问类的成员
       System.out.println(outer.id);
       // 创建内部类的实例,需要外部类的实例
       Outer.Inner1 inner1 = new Outer().new Inner1();
       inner1.say();
       Outer.Inner2 inner2 = new Outer.Inner2();
       inner2.say();
       outer.work();
  }
}

public class Outer {
   int id = 1;
   /**
    * 成员内部类
    */
   class Inner1{
       public void say(){
           System.out.println("Inner1.say");
           System.out.println("Outer.id=" + id);
      }
  }

   /**
    * 静态成员内部类
    */
   static class Inner2{
       public void say(){
           System.out.println("Inner2.say");
           //System.out.println("Outer.id=" + id);
      }
  }
   public void work(){
       /**
        * 方法内部类,只能在方法内部使用
        */
       class Inner1{
           public Inner1(){
               System.out.println("method work Inner1 created");
          }
           void work(){
               System.out.println("method Inner1.work");
          }
      }
       Inner1 inner1 = new Inner1();
       inner1.work();
  }
   public void work2(){
       if(id >0 ){
           /**
            * 块内部类
            */
           class Inner1{
               public Inner1(){
                   System.out.println("if block Inner1 created");
              }
          }
           Inner1 inner1 = new Inner1();
      }
  }

   /**
    * 匿名内部类,一个没有名称的实现了IAnimal接口的类
    */
   IAnimal animal = new IAnimal() {
       @Override
       public void say() {
           System.out.println("匿名内部类的say方法");
      }
  };
   public static void main(String[] args) {
       Outer outer = new Outer();
       // 访问类的成员
       System.out.println(outer.id);
       // 创建内部类的实例,需要外部类的实例
       Outer.Inner1 inner1 = new Outer().new Inner1();
       inner1.say();
       Outer.Inner2 inner2 = new Outer.Inner2();
       inner2.say();
       outer.work();
       outer.work2();
       // animal是Outer类的一个成员,这个成员是匿名内部的实例
       outer.animal.say();
  }
}

以上是所有内部类的案例代码。

posted @ 2021-05-17 21:32  Architecture  阅读(238)  评论(0编辑  收藏  举报