0x01:内部类概述

内部类: 就是在一类中定义一个类。 举例: 在一个类中的内部定义一个类B, 类B就被称为内部类。

内部类的定义格式:

  1. public class 类名{
  2. 修饰符 class 类名{
  3. }
  4. }

内部类的访问特点:

  • 内部类可以直接访问外部类的成员,包括私有
  • 外部类要反问内部类的成员,必须创建对象

image.png

0x02:成员内部类

按照内部类在类中的位置不同,可以分为如下格式

  • 在类中的成员位置:成员内部类
  • 在类中的局部位置:局部内部类

成员内部类使用:

  1. 格式: 外部类名.内部类名 对象名 = 外部类对象.内部类对象
  2. Outer.Inner i = new Outer().new Inner();

如果是私有的内部类,需要定义一个方法,创建私有的内部类的对象
image.png

再去调用它
image.png

0x03:局部内部类

局部内部类是在方法中定义的类,所以外界是无法直接使用,需要在方法内部创建对象并使用该类可以直接访问外部类的成员,也可以访问方法内的局部变量

范例: 定义可一个 Outer类,类中有Inner局部内部类,并在方法中创建了Inner 对象

  1. package test;
  2. public class Outer {
  3. private int num = 10;
  4. public void method(){
  5. class Inner{
  6. public void show(){
  7. System.out.println(num);
  8. }
  9. }
  10. Inner i = new Inner();
  11. i.show();
  12. }
  13. }

创建Outer类的对象,直接调用method方法

  1. package test;
  2. public class demo {
  3. public static void main(String[] args) {
  4. Outer o = new Outer();
  5. o.method();
  6. }
  7. }

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

  1. new 类名或者接口名(){
  2. 重写方法
  3. }
  4. new Inter(){
  5. public void show(){
  6. }
  7. }

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

实例: 创建了一个Outer类, 在Outer类中创建了Inter的匿名的对象

  1. package test;
  2. public class Outer {
  3. /*
  4. public void method(){
  5. new Inter(){
  6. @Override
  7. public void show() {
  8. System.out.println("匿名内部类");
  9. }
  10. }.show;
  11. }
  12. */
  13. public void method(){
  14. Inter i = new Inter(){
  15. @Override
  16. public void show() {
  17. System.out.println("匿名内部类");
  18. }
  19. };
  20. i.show();
  21. }
  22. }

创建了一个接口

  1. package test;
  2. public interface Inter {
  3. void show();
  4. }

测试Demo类

  1. package test;
  2. public class demo {
  3. public static void main(String[] args) {
  4. Outer o = new Outer();
  5. o.method();
  6. }
  7. }