内部类(Inner Class)
定义在另一个类内部的类,主要用途:封装、逻辑分组、增强可读性、专用。
使用规则
- 内部类可以直接访问外部类的所有成员,包括私有成员
- 外部类必须通过创建实例来访问内部类成员
- 内部类可为private/protected修饰以控制访问权限
- 在外部类以外实例化内部类时,需通过”外部类实例.new 内部类()“语法
- 内部类可以视为外部类的一个成员
- 外部使用内部类需要用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;在异常处理中常用匿名内部类创建特定回调。