内部类(Inner Class)

定义在另一个类内部的类,主要用途:封装、逻辑分组、增强可读性、专用。

使用规则

  1. 内部类可以直接访问外部类的所有成员,包括私有成员
  2. 外部类必须通过创建实例来访问内部类成员
  3. 内部类可为private/protected修饰以控制访问权限
  4. 在外部类以外实例化内部类时,需通过”外部类实例.new 内部类()“语法
  5. 内部类可以视为外部类的一个成员
  6. 外部使用内部类需要用static修饰,访问方法:外部类.内部类

四种内部类(未learn)

类型特点访问外部类
成员内部类作为外部类的成员,有访问修饰符,可直接访问外部类的所有成员(包括 private)外部类.this.成员
静态内部类static 修饰,不依赖外部类实例,只能访问外部类的静态成员通过类名调用
局部内部类定义在方法/代码块中,作用域受限,只能访问 final/effectively final 的局部变量需要外部类实例
匿名内部类没有类名,用于创建接口/抽象类的实例,适合一次性使用的实现可访问外部类成员及 final 局部变量

示例

class Outer {
    private int x = 10;
 
    // 成员内部类
    class Inner {
        void display() {
            System.out.println(x);  // 访问外部类私有字段
        }
    }
 
    // 静态内部类
    static class StaticInner {
        void show() {
            System.out.println("静态内部类");
        }
    }
 
    void method() {
        int localVar = 5;
        // 局部内部类
        class LocalInner {
            void print() {
                System.out.println(localVar); // localVar 必须是 final/effectively final
            }
        }
        // 匿名内部类
        Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.println("匿名内部类");
            }
        };
    }
}

注意点

  • 成员内部类不能有静态成员(除非是常量 static final)。
  • 内部类编译后会生成独立的 .class 文件(如 Outer$Inner.class)。
  • 匿名内部类适用于函数式接口(Lambda 表达式是其更简洁的替代)。

异常类(Exception)

程序运行期间发生的不正常情况,Java 通过异常处理机制(try-catch-finally)提供容错能力。

  • ctrl点击系统已定义异常类以查看异常具体情况

try-catch语句

规则:

  • 异常存在包含关系时,子类异常(较小的异常)在catch语句写在顺序靠前位置。
try{
可能发生异常的语句
}
catch(ExceptionSubClass e){
……
}
catch(ExceptionSubClass e){
……
}
……

执行该语句时若出现异常将不会执行try内语句直接抛出异常。

关键点

  • try:监控可能抛出异常的代码块。
  • catch:捕获并处理指定类型的异常,可多个 catch 按顺序匹配。
  • finally:无论是否发生异常都会执行,通常用于释放资源(关闭文件、数据库连接等)。
  • throws:定义函数时,在方法签名中声明可能抛出的异常,交给调用者处理。
  • throw:手动抛出异常对象(throw new Exception("消息"))。

自定义异常

继承自Exception 实例:

class MyException extends Exception {
    public MyException(String message) {
        super(message);
    }
}

try-with-resources(Java 7+)

自动关闭实现了 AutoCloseable 的资源,可省略 finally 中的手动关闭。

try (FileInputStream fis = new FileInputStream("file.txt")) {
    // 使用 fis
} catch (IOException e) {
    e.printStackTrace();
}

关系:内部类和异常类常结合使用——例如在匿名内部类中访问外部变量时,局部变量必须为 effectively final;在异常处理中常用匿名内部类创建特定回调。

断言(assert)