内部类


成员内部类

它的格式一般如下

class C{
   class D{
?
  }
}

特点成员内部类可以无条件访问外部类的属性和方法,但是外部类想要访问内部类属性或方法时,必须要创建一个内部类对象,然后通过该对象访问内部类的属性或方法

成员内部类无条件访问外部类的属性和方法

class C{
   private String name = "外部类";
   public void run(){
       System.out.println("外部类奔跑");
  }
   class D{
       public void say(){
           System.out.println(name);
           run();
      }
  }
}

外部类访问内部类属性方法,必须先创建对象

class C{
   private String name = "外部类";
   public void run(){
       System.out.println("外部类奔跑");
  }
   /*使用内部类的属性和方法*/
   public void eat(){
       D d = new D();
       System.out.println(d.value);
       d.say();
  }
   class D{
       private String value = "DDD";
       public void say(){
           System.out.println(name);
           run();
      }
  }
}

如果内部类方法属性和内部类属性重名,导致外部类属性方法在内部类被隐藏,也可以按照外部类名.this.属性 进行调用

class C{
   private String name = "外部类";
   public void run(){
       System.out.println("外部类奔跑");
  }
   /*使用内部类的属性和方法*/
   public void eat(){
       D d = new D();
       System.out.println(d.value);
       d.say();
  }
   class D{
       private String value = "DDD";
       private String name = "内部类";
       public void say(){
           System.out.println(C.this.name);
           System.out.println(name);
           run();
      }
  }
}

创建内部类对象

C.D d=new C().new D();

局部内部类

局部内部类存在于方法中

他和成员内部类的区别在于局部内部类的访问权限仅限于方法或作用域中

局部内部类是定义在方法中的类,所以外界无法直接使用,需要在方法内部创建对象并使用

内部类

成员内部类

它的格式一般如下

class C{
   class D{
?
  }
}

特点成员内部类可以无条件访问外部类的属性和方法,但是外部类想要访问内部类属性或方法时,必须要创建一个内部类对象,然后通过该对象访问内部类的属性或方法

成员内部类无条件访问外部类的属性和方法

class C{
   private String name = "外部类";
   public void run(){
       System.out.println("外部类奔跑");
  }
   class D{
       public void say(){
           System.out.println(name);
           run();
      }
  }
}

外部类访问内部类属性方法,必须先创建对象

class C{
   private String name = "外部类";
   public void run(){
       System.out.println("外部类奔跑");
  }
   /*使用内部类的属性和方法*/
   public void eat(){
       D d = new D();
       System.out.println(d.value);
       d.say();
  }
   class D{
       private String value = "DDD";
       public void say(){
           System.out.println(name);
           run();
      }
  }
}

如果内部类方法属性和内部类属性重名,导致外部类属性方法在内部类被隐藏,也可以按照外部类名.this.属性 进行调用

class C{
   private String name = "外部类";
   public void run(){
       System.out.println("外部类奔跑");
  }
   /*使用内部类的属性和方法*/
   public void eat(){
       D d = new D();
       System.out.println(d.value);
       d.say();
  }
   class D{
       private String value = "DDD";
       private String name = "内部类";
       public void say(){
           System.out.println(C.this.name);
           System.out.println(name);
           run();
      }
  }
}

创建内部类对象

C.D d=new C().new D();

局部内部类

局部内部类存在于方法中

他和成员内部类的区别在于局部内部类的访问权限仅限于方法或作用域中

局部内部类是定义在方法中的类,所以外界无法直接使用,需要在方法内部创建对象并使用

image-20210814215808844

匿名内部类

前提:存在一个类或者接口,这里的类可以是具体类,也可以抽象类。

格式

new 类名或接口名(){
重写方法;
}

本质是继承了该类或者实现了该接口的子类匿名对象

image-20210814220603389

可以多次调用

image-20210814220654475

匿名内部类在开发中的使用

在需要传入不同对象时可以直接使用匿名内部类new 一个对象

image-20210814220942298

image-20210814221050441

内部类的好处

  1. 完善了Java多继承机制,由于每一个内部类都可以独立的继承接口或类,所以无论外部类是否继承或实现了某个类或接口,对于内部类没有影响。

  2. 方便写事件驱动程序。

##

匿名内部类

前提:存在一个类或者接口,这里的类可以是具体类,也可以抽象类。

格式

new 类名或接口名(){
重写方法;
}

本质是继承了该类或者实现了该接口的子类匿名对象

image-20210814220603389

可以多次调用

image-20210814220654475

匿名内部类在开发中的使用

在需要传入不同对象时可以直接使用匿名内部类new 一个对象

image-20210814220942298

image-20210814221050441

内部类的好处

  1. 完善了Java多继承机制,由于每一个内部类都可以独立的继承接口或类,所以无论外部类是否继承或实现了某个类或接口,对于内部类没有影响。

  2. 方便写事件驱动程序。

##