Java继承与高级特性:内部类与Lambda表达式深度解析
内部类:封装与灵活性
内部类是定义在另一个类内部的类,分为成员内部类、局部内部类、静态内部类(嵌套类)和匿名内部类,每种类型适用于不同场景。
成员内部类
成员内部类与普通成员变量类似,属于外部类的实例。可直接访问外部类的所有成员(包括私有属性)。
class Outer {
private int value = 10;
class Inner {
void printValue() {
System.out.println(value); // 直接访问外部类私有成员
}
}
}
// 使用方式
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.printValue();
局部内部类
定义在方法或作用域内的类,仅在该范围内有效。常用于需要临时实现特定功能的场景。
class Outer {
void createLocalClass() {
class LocalInner {
void display() {
System.out.println("局部内部类");
}
}
new LocalInner().display();
}
}
静态内部类(嵌套类)
使用static修饰,不依赖外部类实例,可直接通过外部类名访问。适合工具类或与外部类逻辑解耦的场景。
class Outer {
static class Nested {
void show() {
System.out.println("静态内部类");
}
}
}
// 使用方式
Outer.Nested nested = new Outer.Nested();
nested.show();
匿名内部类
无需显式定义类名,直接实现接口或继承父类。常用于事件监听、线程实现等一次性任务。
Runnable task = new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类实现");
}
};
new Thread(task).start();
实用案例:事件监听
匿名内部类在GUI开发中广泛使用,例如Swing按钮事件:
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("按钮被点击");
}
});
Lambda表达式:简化函数式编程
Lambda表达式是Java 8引入的核心特性,用于简化匿名内部类的语法,提升代码简洁性。
初识作用
Lambda通过->符号分隔参数和实现体,替代冗余的匿名类代码。例如:
Runnable lambdaTask = () -> System.out.println("Lambda简化线程");
new Thread(lambdaTask).start();
Lambda表达式定义
语法格式为(参数) -> { 实现体 }。根据场景可省略参数类型或大括号:
// 无参数
() -> System.out.println("Hello");
// 单参数(可省略括号)
x -> x * x;
// 多参数
(a, b) -> a + b;
函数式接口
仅包含一个抽象方法的接口(如Runnable、Comparator),可通过Lambda实现。使用@FunctionalInterface注解标记。
@FunctionalInterface
interface Greeting {
void sayHello(String name);
}
// Lambda实现
Greeting greet = name -> System.out.println("Hello, " + name);
greet.sayHello("Alice");
预定义函数式接口
Java 8提供java.util.function包,包含常用函数式接口:
- Supplier<T>:无参返回结果(() -> T)。
- Consumer<T>:接收参数无返回(T -> void)。
- Function<T, R>:接收T返回R(T -> R)。
- Predicate<T>:条件判断(T -> boolean)。
Predicate<String> isLong = s -> s.length() > 5;
System.out.println(isLong.test("Lambda")); // true
双冒号运算(方法引用)
进一步简化Lambda,通过::引用已有方法。支持静态方法、实例方法、构造方法等。
List<String> names = Arrays.asList("Alice", "Bob");
names.forEach(System.out::println); // 实例方法引用
实用案例:集合排序
结合Lambda和Comparator实现动态排序:
List<String> words = Arrays.asList("apple", "banana", "cherry");
words.sort((s1, s2) -> s1.length() – s2.length()); // 按长度排序
words.sort(String::compareToIgnoreCase); // 方法引用忽略大小写
总结
内部类通过嵌套结构增强封装性,匿名内部类与Lambda结合可大幅减少模板代码。Lambda表达式和函数式接口推动Java向函数式编程范式演进,而方法引用进一步优化语法。实际开发中,根据场景选择合适特性,可显著提升代码可读性和维护性。


