在Java中,内部类(Inner Class)是指在一个类的内部定义的另一个类。内部类可以直接访问外部类的所有成员变量和方法(包括private和protected),并且可以根据其定义的位置和权限分为几种不同类型:
-
成员内部类(Member Inner Class) 成员内部类可以是静态的(Static Nested Class)或非静态的(Non-static Nested Class)。
非静态内部类(普通成员内部类)
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<String> list = new ArrayList<String>() { // 匿名内部类扩展ArrayList功能 @Override public boolean add(String s) { System.out.println("Adding element: " + s); return super.add(s); } }; list.add("Item 1"); } }
静态内部类(Static Nested Class)
public class OuterClass { private static String staticData = "Static Data"; // 静态内部类 static class StaticInnerClass { void displayStaticData() { // 只能访问staticData,不能直接访问非静态成员 System.out.println(OuterClass.staticData); } } public static void useStaticInnerClass() { StaticInnerClass inner = new StaticInnerClass(); inner.displayStaticData(); } } // 使用 public class Main { public static void main(String[] args) { // 不需要外部类实例就可以创建静态内部类对象 OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass(); OuterClass.useStaticInnerClass(); } }
-
局部内部类(Local Inner Class) 局部内部类是在方法或者代码块内部定义的类,它的作用域只限于所在的方法或代码块。
public class OuterClass { public void method() { // 局部内部类 class LocalInnerClass { void displayMessage() { System.out.println("This is a local inner class."); } } // 在方法内部创建并使用内部类对象 LocalInnerClass local = new LocalInnerClass(); local.displayMessage(); } public static void main(String[] args) { OuterClass outer = new OuterClass(); outer.method(); // 无法在这里创建或访问LocalInnerClass对象,因为它的作用域仅限于method方法内 } }
-
匿名内部类(Anonymous Inner Class) 匿名内部类是没有名字的内部类,通常用于简化单次使用的类的创建过程,常用于事件监听、适配器等场景。
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<String> list = new ArrayList<String>() { // 匿名内部类扩展ArrayList功能 @Override public boolean add(String s) { System.out.println("Adding element: " + s); return super.add(s); } }; list.add("Item 1"); } }
在上述示例中,内部类的设计提高了代码的封装性和灵活性,使得类与类之间的关系更加紧密,同时也增加了代码的复杂度,应当根据实际情况权衡是否使用内部类。