什么是Java内部类
Java内部类是指在一个类的内部定义的类。它可以访问外部类的成员变量和方法,甚至可以访问外部类的私有成员。内部类可以分为成员内部类、局部内部类和匿名内部类三种类型。
成员内部类
成员内部类是定义在一个类的内部的另一个类,它与外部类的实例相关联。成员内部类可以访问外部类的所有成员,包括私有成员。
下面是一个示例代码,演示了如何定义和使用成员内部类:
public class OuterClass {
private int outerNum;
public OuterClass(int num) {
this.outerNum = num;
}
private void outerMethod() {
System.out.println("Outer Method");
}
public class InnerClass {
public void innerMethod() {
System.out.println("Inner Method");
outerMethod();
System.out.println("Outer Number: " + outerNum);
}
}
public static void main(String[] args) {
OuterClass outer = new OuterClass(10);
OuterClass.InnerClass inner = outer.new InnerClass();
inner.innerMethod();
}
}
在上面的代码中,OuterClass
是外部类,InnerClass
是成员内部类。在main
方法中,我们首先创建了一个外部类的实例outer
,然后使用outer
实例来创建内部类的实例inner
。通过内部类的实例,我们可以调用内部类的方法innerMethod
,并且可以访问外部类的成员变量outerNum
和方法outerMethod
。
局部内部类
局部内部类是定义在一个方法或代码块内部的类,它只能在该方法或代码块内部被访问。局部内部类可以访问外部类的成员变量和方法,但是只能访问被final
修饰的局部变量。
下面是一个示例代码,演示了如何定义和使用局部内部类:
public class OuterClass {
private int outerNum;
public OuterClass(int num) {
this.outerNum = num;
}
public void outerMethod() {
final int localNum = 20;
class LocalInnerClass {
public void innerMethod() {
System.out.println("Inner Method");
System.out.println("Outer Number: " + outerNum);
System.out.println("Local Number: " + localNum);
}
}
LocalInnerClass inner = new LocalInnerClass();
inner.innerMethod();
}
public static void main(String[] args) {
OuterClass outer = new OuterClass(10);
outer.outerMethod();
}
}
在上面的代码中,OuterClass
是外部类,LocalInnerClass
是局部内部类。在outerMethod
方法中,我们定义了一个局部变量localNum
,并将其设置为final
。然后,在局部内部类中,我们可以访问外部类的成员变量outerNum
和方法outerMethod
,以及局部变量localNum
。
匿名内部类
匿名内部类是没有名字的内部类,它通常用作实现某个接口或继承某个类的临时实例。匿名内部类没有构造方法,它的定义和创建同时完成。
下面是一个示例代码,演示了如何定义和使用匿名内部类:
public class OuterClass {
public void outerMethod() {
MathOperation operation = new MathOperation() {
@Override
public int operate(int a, int b) {
return a + b;
}
};
int result = operation.operate(10, 20);
System.out.println("Result: " + result);
}
public static void main(String[] args) {
OuterClass outer = new OuterClass();
outer.outerMethod();
}
}
interface MathOperation {
int operate(int a, int b);
}
在上面的代码中,我们定义了一个接口MathOperation
,其中包含一个operate
方法。然后,在outerMethod
方法中,我们使用匿名内部类来实现MathOperation
接口,并重写了operate
方法。通过匿名内部类的实例,我们可以调用operate
方法,计算两个数的和。
总结
Java内部