"Java基础笔记-7-26"
在Java编程语言中,内部类是一个重要的概念,它允许我们在一个类的定义内部定义另一个类。这种设计模式提供了代码封装和复用的优势,使得复杂的面向对象设计变得可能。以下是关于内部类的详细解释:
1. 非静态内部类(也称为成员内部类)
非静态内部类是定义在另一个类内部的类,它可以访问外部类的所有成员,包括私有成员。这是因为内部类被视为外部类的一个成员,它们之间的关系非常紧密。例如,在描述中的代码片段中,`Outer`类有一个非静态内部类`Inner`,`Inner`可以直接访问`Outer`的私有变量`number`。创建内部类的实例时,必须先创建外部类的实例,因为内部类是依附于外部类存在的。
```java
Outer outer = new Outer(20); // 创建外部类实例
Inner inner = outer.new Inner("张三", 18); // 使用外部类实例创建内部类实例
```
2. 静态内部类
当使用`static`关键字修饰内部类时,它被称为静态内部类或嵌套类。静态内部类与普通内部类的主要区别在于,它们不依赖于外部类的实例,可以直接通过外部类名进行访问。这使得静态内部类可以像普通的静态成员一样被创建和使用。例如,`Outer2`类有一个静态内部类`StaticInner`,我们可以这样创建它的实例:
```java
Outer2.StaticInner staticInner = new Outer2.StaticInner(); // 直接创建静态内部类实例
```
静态内部类不能直接访问外部类的非静态成员,因为它们不依赖于特定的外部类实例。如果需要访问,可以通过传递外部类实例的方式实现。
```java
public class Outer2 {
private int number = 100;
public static class StaticInner {
public void accessNumber(Outer2 outer2) {
System.out.println("外部类的非静态变量:" + outer2.number);
}
}
}
// 在外部类或测试类中使用
Outer2 outer2 = new Outer2();
outer2.new StaticInner().accessNumber(outer2);
```
总结来说,内部类是Java提供的一种高级特性,它增强了代码的组织性和封装性。非静态内部类可以紧密地与外部类关联,而静态内部类则更像是一种辅助工具,可以独立于外部类实例存在。这两种类型都为解决特定设计问题提供了便利,比如实现事件监听器、匿名内部类等。理解和熟练使用内部类是Java程序员进阶的重要步骤。