Java内部类详解
1.内部类的概念
内部类是指将一个类的定义放置在另一个类的内部。在这种结构中,包含内部类的外部类称为外部类,而被包含的类则称为内部类。
class OuterClass {
class InnerClass {
// 内部类定义
}
}
2.内部类的分类
Java中的内部类主要分为以下几种类型:
- 成员内部类(包括静态内部类和非静态内部类)
- 局部内部类
- 匿名内部类
3.静态内部类
静态内部类是使用static关键字修饰的内部类。
定义语法:
public class OuterClass {
static class StaticInnerClass {
// 静态内部类成员
}
}
重要特性:
- 静态内部类中可以定义属性、方法、构造函数等成员,可以被四种访问修饰符(public、protected、默认、private)修饰
- 静态内部类可以被final修饰(表示不能被继承)或abstract修饰(表示不能被实例化)
- 静态内部类只能访问外部类的静态成员,无法直接访问非静态成员
实例化方式:
OuterClass.StaticInnerClass instance = new OuterClass.StaticInnerClass();
4.非静态内部类
非静态内部类(也称为实例内部类)是没有被static修饰的成员内部类。
定义语法:
public class OuterClass {
class InstanceInnerClass {
// 非静态内部类成员
}
}
重要特性:
- 内部类中可以定义属性、方法、构造函数等,支持四种访问修饰符
- 可以声明为final或abstract
- 非静态内部类可以直接访问外部类的所有成员(包括静态和非静态)
- 非静态内部类中不能定义静态成员(静态常量除外)
实例化方式:
OuterClass outer = new OuterClass();
OuterClass.InstanceInnerClass instance = outer.new InstanceInnerClass();
5.局部内部类
局部内部类是指定义在方法、代码块或构造函数内部的类。
public class Person {
public void speak() {
class LocalHeart {
public void beat() {
System.out.println("心脏跳动");
}
}
LocalHeart heart = new LocalHeart();
heart.beat();
}
}
6.接口、抽象类、普通类作为参数和返回值
接口类型作为参数和返回值
当接口作为方法参数时,传递的是实现类的实例;当作为返回值时,返回的也是实现类的实例。
public interface NetworkAdapter {
void connect();
}
public class WifiAdapter implements NetworkAdapter {
@Override
public void connect() {
System.out.println("WiFi已连接");
}
}
public class Application {
public static void main(String[] args) {
WifiAdapter adapter = new WifiAdapter();
invokeMethod(adapter);
NetworkAdapter result = getAdapter();
result.connect();
}
public static void invokeMethod(NetworkAdapter adapter) {
adapter.connect();
}
public static NetworkAdapter getAdapter() {
WifiAdapter wifi = new WifiAdapter();
return wifi;
}
}
抽象类作为参数和返回值
抽象类作为方法参数时,接收的是子类对象;作为返回值时,返回的也是子类对象。
public abstract class Vehicle {
public abstract void run();
}
public class Car extends Vehicle {
@Override
public void run() {
System.out.println("汽车在行驶");
}
}
public class TransportDemo {
public static void main(String[] args) {
Car car = new Car();
startVehicle(car);
Vehicle vehicle = createVehicle();
vehicle.run();
}
public static void startVehicle(Vehicle v) {
v.run();
}
public static Vehicle createVehicle() {
Car car = new Car();
return car;
}
}
普通类作为参数和返回值
public class Student {
public void study() {
System.out.println("学生正在学习");
}
}
public class SchoolDemo {
public static void main(String[] args) {
Student s = new Student();
teachStudent(s);
Student newStudent = createStudent();
newStudent.study();
}
public static void teachStudent(Student student) {
student.study();
}
public static Student createStudent() {
Student student = new Student();
return student;
}
}
7.匿名内部类
匿名内部类是没有显式名称的内部类,通常用于简化代码,特别适合只需一次性使用的情况。
使用方式一:利用有名对象创建
interface DataProcessor {
void process();
}
DataProcessor processor = new DataProcessor() {
@Override
public void process() {
System.out.println("数据处理中");
}
};
processor.process();
使用方式二:直接使用匿名对象
new DataProcessor() {
@Override
public void process() {
System.out.println("数据处理中");
}
}.process();
匿名内部类作为方法参数
interface DataProcessor {
void process();
}
public static void execute(DataProcessor processor) {
processor.process();
}
public static void main(String[] args) {
execute(new DataProcessor() {
@Override
public void process() {
System.out.println("处理数据");
}
});
}
匿名内部类作为返回值
public static DataProcessor createProcessor() {
return new DataProcessor() {
@Override
public void process() {
System.out.println("创建处理器并处理数据");
}
};
}
public static void main(String[] args) {
DataProcessor dp = createProcessor();
dp.process();
}
总结
Java内部类提供了强大的封装和组织代码的能力。静态内部类适用于与外部类关联但不需要访问外部类实例的场景;非静态内部类可以访问外部类的所有成员;局部内部类适用于方法内部的局部逻辑;匿名内部类则适合简化代码,特别是一次性的接口实现场景。