欢迎访问宙启技术站
智能推送

Java函数的内部类和局部类使用方法

发布时间:2023-06-23 02:58:34

Java是一门面向对象编程语言,因此Java的所有特性都依赖于类和对象。Java的内部类和局部类是Java语言中的一种特殊类型的类。这些类定义在其他类的内部,并且具有访问外部类的成员属性和方法的优势。本文将详细介绍Java的内部类和局部类的使用方法。

一、内部类

1. 什么是内部类

内部类是定义在另一个类中的类。内部类可以访问封装在其外部类中的所有变量和方法,包括那些用private、protected和public修饰的成员等。与之相对应的是外部类,外部类不能直接访问内部类的成员。

2. 使用内部类

Java内部类主要分为四种:静态内部类、成员内部类、局部内部类和匿名内部类。

1. 静态内部类:

静态内部类是定义在外部类中的一个静态class。静态内部类不依赖于外部类的实例化对象,因此可以在没有外部类对象的情况下创建内部类的实例。

静态内部类的定义方式:

public class OuterClass {
    private static class InnerClass {
        // ...
    }
}

2. 成员内部类:

成员内部类是定义在外部类的非静态区域中的一个class。这种内部类依赖于外部类的实例化对象,可以访问外部类的所有属性和方法。

成员内部类的定义方式:

public class OuterClass {
  private class InnerClass {
    // ...
  }
}

3. 局部内部类:

局部内部类是定义在方法内部的class,类似于局部变量和方法中的内联函数。这种内部类也可以访问外部类的所有属性和方法。

局部内部类的定义方式:

public class OuterClass {
  void someMethod() {
    class InnerClass {
      // ...
    }
  }
}

4. 匿名内部类:

匿名内部类是没有名字的内部类,通常情况下它是用来实现接口的。当需要在某些方法中实现某个接口时,可以使用匿名内部类来实现,省去实现接口的复杂过程。

匿名内部类的定义方式:

public class OuterClass {
  void someMethod() {
    Runnable r = new Runnable() {
      // 实现run方法
      public void run() {
        // ...
      }
    };
    Thread t = new Thread(r);
    t.start();
  }
}

二、局部类

1. 什么是局部类

局部类是定义在一个方法或代码块中的类,它只能在方法或代码块中使用。局部类可以访问它所在外部方法或代码块的局部变量、方法参数和类成员变量,如果这些变量是final类型的,那么它们也成为了局部类的成员变量。局部类是用来封装一个方法或代码块中的逻辑片段,以保证代码的简洁性和可读性。

2. 使用局部类

局部类的使用方法与内部类类似,只是声明位置不同。

局部类的定义利用了Java的方法作用域,如下:

public class OuterClass {
  void someMethod() {
    class InnerClass {
      // ...
    }
    InnerClass ic = new InnerClass();
  }
}

局部类如果要访问方法或代码块中的变量,那么这些变量必须是final类型的。

public class OuterClass {
  void someMethod() {
    final int x = 0;
    class InnerClass {
      public void someInnerMethod() {
        System.out.println(x);
        // x++;  // 编译失败,不能修改final类型的变量
      }
    }
    InnerClass ic = new InnerClass();
    ic.someInnerMethod();
  }
}

局部类与内部类的对比:

1.作用域不同

局部类的作用范围仅限于包含它的方法或代码块内部,而内部类的作用范围为外部类。

2. 分类不同

内部类根据定义的位置和修饰符分类为四种,而局部类仅分为一种。

3. 使用频率不同

通常情况下,内部类的使用频率比局部类高,因为内部类可以用来定义回调函数、监听器和适配器等。通常,“非常用功能”常会使用局部类来实现。