精通 Java 嵌套类与内部类:类型、示例与最佳实践
Java 嵌套类与内部类
探索 Java 嵌套类如何增强封装、提升可读性,并启用强大的内部类模式。
Java 中可在类内部声明另一个类 —— 称为 嵌套类。例如:
class OuterClass { // ... class NestedClass { // ... } }
嵌套类主要有两种形式:
- 非静态嵌套类(通常称为 内部类)
- 静态嵌套类
推荐阅读:
- Java 访问修饰符
- Java static 关键字
非静态嵌套类(内部类)
内部类驻留在外部类内,可自由访问外部类成员(甚至私有成员)。因其绑定外部类实例,必须先实例化外部类。
示例 1:内部类
class CPU { double price; // 内部类 class Processor{ double cores; String manufacturer; double getCache(){ return 4.3; } } // protected 内部类 protected class RAM{ double memory; String manufacturer; double getClockSpeed(){ return 5.5; } } } public class Main { public static void main(String[] args) { CPU cpu = new CPU(); CPU.Processor processor = cpu.new Processor(); CPU.RAM ram = cpu.new RAM(); System.out.println("Processor Cache = " + processor.getCache()); System.out.println("Ram Clock speed = " + ram.getClockSpeed()); } }
输出:
Processor Cache = 4.3 Ram Clock speed = 5.5
此处 Processor 和 RAM 嵌套在 CPU 内。RAM 声明为 protected,演示内部类可使用任意 Java 访问修饰符。
在 Main 中,先实例化外部类 CPU,再通过外部实例创建内部类实例:
CPU.Processor processor = cpu.new Processor; CPU.RAM ram = cpu.new RAM();
提示:点(.)运算符用于将内部类实例绑定到其外部实例。
从内部类访问外部类成员
内部类可通过外部类名加 this 关键字引用外部类成员,如 Car.this.carType。当内部类有自己的 this 上下文时,此语法是必要的。
示例 2:与外部类交互
class Car { String carName; String carType; public Car(String name, String type) { this.carName = name; this.carType = type; } private String getCarName() { return this.carName; } // 内部类 class Engine { String engineType; void setEngine() { if(Car.this.carType.equals("4WD")){ if(Car.this.getCarName().equals("Crysler")) { this.engineType = "Smaller"; } else { this.engineType = "Bigger"; } } else { this.engineType = "Bigger"; } } String getEngineType(){ return this.engineType; } } } public class Main { public static void main(String[] args) { Car car1 = new Car("Mazda", "8WD"); Car.Engine engine = car1.new Engine(); engine.setEngine(); System.out.println("Engine Type for 8WD= " + engine.getEngineType()); Car car2 = new Car("Crysler", "4WD"); Car.Engine c2engine = car2.new Engine(); c2engine.setEngine(); System.out.println("Engine Type for 4WD = " + c2engine.getEngineType()); } }
输出:
Engine Type for 8WD= Bigger Engine Type for 4WD = Smaller
尽管 getCarName() 是 private,内部类仍可调用,因为它位于同一外部类内。
静态嵌套类
静态嵌套类无需外部类实例即可创建。因此它不能直接访问外部类的非静态成员。使用外部类名创建:
OuterClass.NestedClass obj = new OuterClass.NestedClass();
示例 3:静态嵌套类
class MotherBoard { static class USB{ int usb2 = 2; int usb3 = 1; int getTotalPorts(){ return usb2 + usb3; } } } public class Main { public static void main(String[] args) { MotherBoard.USB usb = new MotherBoard.USB(); System.out.println("Total Ports = " + usb.getTotalPorts()); } }
输出:
Total Ports = 3
示例 4:在静态嵌套类中尝试访问外部成员
class MotherBoard { String model; public MotherBoard(String model) { this.model = model; } static class USB{ int usb2 = 2; int usb3 = 1; int getTotalPorts(){ if(MotherBoard.this.model.equals("MSI")) { return 4; } else { return usb2 + usb3; } } } } public class Main { public static void main(String[] args) { MotherBoard.USB usb = new MotherBoard.USB(); System.out.println("Total Ports = " + usb.getTotalPorts()); } }
运行此代码产生:
error: non-static variable this cannot be referenced from a static context
此错误因静态嵌套类无外部实例无法引用 MotherBoard.this。
关键要点
- 内部类视为外部类的常规成员,可声明
private、protected或public。 - 它们可自由访问外部类所有成员,包括
private成员。 - 静态嵌套类不需外部实例,不能直接访问非静态外部成员。
- 使用嵌套类促进封装,将相关逻辑捆绑。
- 内部类适合回调、监听器或与外部类紧密耦合的辅助对象。
java