Java内部类
Java内部类(Inner Class)是指定义在另一个类内部的类,它允许在一个类的内部定义另一个类。内部类可以访问外部类的成员变量和方法,并且可以用来实现一些特定的功能。
Java内部类(Inner Class)可以分为四种类型:成员内部类(Member Inner Classes)、静态内部类(Static Nested Classes)、局部内部类(Local Inner Classes)和匿名内部类(Anonymous Inner Classes):
• 成员内部类:定义在外部类的成员变量位置,并且可以访问外部类的成员变量和方法。
• 静态内部类:定义在外部类的静态变量位置,并且可以拥有自己的静态变量和方法。
• 局部内部类:定义在外部类的方法体内,作用域通常被限制在该方法中。
• 匿名内部类:没有名称的内部类,通常用来简化代码,在创建线程、事件处理等方面被广泛使用。
需要注意的是,在创建成员内部类对象时,必须先创建外部类对象,再使用外部类对象来创建成员内部类对象。因为成员内部类的存在依赖于外部类对象。
每种类型的介绍和注意事项
成员内部类(Member Inner Classes)
成员内部类是定义在另一个类中的类。它可以访问该外部类的所有成员变量和方法,即使它们被声明为私有。可通过以下步骤创建成员内部类:
1. 在外部类中使用关键字 class 创建一个成员内部类。
2. 调用外部类的构造函数或方法来创建成员内部类对象。
3. 可以使用 new 运算符创建成员内部类对象。
注意事项:
• 内部类可以使用外部类的 private 成员(包括私有方法和变量)。
• 外部类不能直接访问内部类的成员。在外部类中,必须先创建内部类对象,然后才能访问内部类的成员。
• 使用内部类时应仔细考虑垃圾回收问题。如果内部类对象在外部类对象之外引用,则可能会导致内存泄漏。
静态内部类(Static Nested Classes)
静态内部类是静态声明的类,与外部类实例无关。它与其他静态成员类似,可以通过类名引用。
可通过以下步骤创建静态内部类:
1. 在外部类中使用关键字 static 和 class 创建一个静态内部类。
2. 使用外部类的名称和点运算符来访问静态内部类。
注意事项:
• 静态内部类不能直接访问外部类的非静态成员。要访问外部类的非静态成员,需要首先创建外部类对象。
• 可以将静态内部类用作外部类的辅助类,但是,如果静态内部类不依赖于外部类实例,则最好将其声明为静态成员。
• 因为静态内部类不引用外部类实例,因此它可以防止内存泄漏等问题。
局部内部类(Local Inner Classes)
局部内部类是在代码块、方法或构造函数中定义的类。它只在该块中可见,并且通常用于解决特定问题。
可通过以下步骤创建局部内部类:
1. 在代码块、方法或构造函数中使用关键字 class 创建一个局部内部类。
2. 调用该块的方法或构造函数来创建局部内部类对象。
注意事项:
• 局部内部类不能用 public、protected 或 private 修饰。
• 局部内部类只能在声明它的块中实例化。
• 可以访问外部类的所有成员,包括私有成员。
匿名内部类(Anonymous Inner Classes)
匿名内部类是没有名称的局部内部类。它通常在创建对象时使用,并且只能实例化一次。
可通过以下步骤创建匿名内部类:
1. 使用关键字 new 和要实现的接口或继承的基类来创建一个对象。
2. 在大括号中编写代码块实现接口或继承的基类的方法。
注意事项:
• 匿名内部类通常用于事件处理程序和回调函数中。
• 不能为匿名内部类定义构造函数。
• 可以访问外部类的成员变量和方法,但只能访问最终变量(也就是值不会改变的变量)。
• 匿名内部类可以实现接口或继承一个类,但不能同时实现接口和继承一个类。
• 如果要在匿名内部类中使用一个局部变量,则该变量必须声明为 final。
这些注意事项可以帮助我们更好地理解和使用Java中的内部类。
下面给出一个Java内部类例子源码:
public class OuterClass {
private int num = 10;
private static int staticNum = 20;
public void outerMethod() {
System.out.println("Outer method");
// 局部内部类
class LocalInnerClass {
public void localMethod() {
System.out.println("Local method");
}
}
LocalInnerClass localInnerObj = new LocalInnerClass();
localInnerObj.localMethod();
// 匿名内部类
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Anonymous inner class");
}
};
Thread thread = new Thread(runnable);
thread.start();
}
// 成员内部类
public class InnerClass {
public void display() {
System.out.println("num = " + num);
System.out.println("staticNum = " + staticNum);
outerMethod(); // 访问外部类方法
}
}
// 静态内部类
public static class StaticInnerClass {
public void print() {
System.out.println("Static inner class");
System.out.println("staticNum = " + staticNum);
}
}
public static void main(String[] args) {
OuterClass outerObj = new OuterClass();
InnerClass innerObj = outerObj.new InnerClass();
innerObj.display();
StaticInnerClass staticInnerObj = new StaticInnerClass();
staticInnerObj.print();
}
}
编译运行输出结果为:
num = 10
staticNum = 20
Outer method
Local method
Static inner class
staticNum = 20
Anonymous inner class
注意,内部类的作用域:内部类可以访问外部类的所有成员变量和方法,包括私有成员。但是,外部类不能直接访问内部类的成员变量和方法。此外,在不同的内部类之间也不能相互访问。
顺便提示,不要混淆了内部类(Inner Class)和嵌套类(Nested Class)
Java中的嵌套类(Nested Class)包括两种类型:静态嵌套类(Static Nested Class)和非静态嵌套类(Non-Static Nested Class)。非静态嵌套类(Non-Static Nested Class)是内部类(Inner Class)的一种,但是内部类并不全都是非静态嵌套类,非静态嵌套类属于内部类的一个子集。非静态嵌套类分为四种类型:成员内部类(Member Inner Class)、局部内部类(Local Inner Class)、匿名内部类(Anonymous Inner Class)和方法内部类(Method Local Inner Class)。
附录、进一步学习了解
Java的内部类是什么? - 知乎
彻底理解内部类的使用(详细篇) - 掘金
Java内部类(一篇就够)_java 内部类_赶路人儿的博客-CSDN博客