JAVA 内部类详解及实例
Java内部类可以看作是一种定义在另一个类内部的类。它们有访问外部类的所有成员的权限。Java内部类可以分为四种:成员内部类、局部内部类、匿名内部类和静态内部类。
成员内部类
成员内部类定义在外部类的内部,并且不是static类型的。成员内部类可以直接访问外部类的成员变量和方法,并且可以通过this关键字访问自己的成员变量和方法。下面是一个成员内部类的示例代码:
public class OuterClass {
private int outerField;
public class InnerClass {
private int innerField;
public void accessOuterField() {
System.out.println("Outer field value: " + outerField);
}
public void accessInnerField() {
System.out.println("Inner field value: " + innerField);
}
}
}
上述代码中,InnerClass是OuterClass的成员内部类。在InnerClass中,可以访问外部类的私有成员变量outerField,并且可以访问自己的私有成员变量innerField。
在外部类中创建InnerClass的示例代码如下:
OuterClass outerObj = new OuterClass();
OuterClass.InnerClass innerObj = outerObj.new InnerClass();
使用new关键字创建InnerClass的实例时,需要首先创建OuterClass的实例。然后通过outerObj.new的方式来创建InnerClass的实例。最后,通过innerObj来访问InnerClass的成员方法和变量。
局部内部类
局部内部类定义在方法内部,可以访问方法内的变量和参数,但是这些变量和参数必须是final类型的。下面是一个局部内部类的示例代码:
public class OuterClass {
public void someMethod() {
final int localVar = 3;
class LocalInnerClass {
public void printLocalVar() {
System.out.println("Local variable value: " + localVar);
}
}
LocalInnerClass innerObj = new LocalInnerClass();
innerObj.printLocalVar();
}
}
上述代码中,LocalInnerClass是OuterClass的局部内部类,可以访问someMethod()方法中的局部变量localVar。需要注意的是,localVar必须是final类型的。
匿名内部类
匿名内部类是没有名字的局部内部类,并且它们是在创建对象时定义的。匿名内部类通常用于简单的单次操作,它们可以实现接口或扩展抽象类。下面是一个匿名内部类的示例代码:
public interface MessageService {
void sendMessage(String message);
}
public class Foo {
public void sendMessage() {
MessageService messageService = new MessageService() {
public void sendMessage(String message) {
System.out.println("Sending message: " + message);
}
};
messageService.sendMessage("Hello, world!");
}
}
上述代码中,MessageService是一个接口,Foo类中的sendMessage()方法创建了一个实现了MessageService接口的匿名内部类,在匿名内部类中实现了sendMessage()方法并打印了消息。然后,通过messageService.sendMessage()方法来发送消息。
静态内部类
静态内部类是定义在外部类内部的静态class。静态内部类通常用于分类关系,例如使用多个类来实现一个接口。静态内部类不能访问外部类的非静态变量和方法。下面是一个静态内部类的示例代码:
public class OuterClass {
private static int outerField;
public static class StaticInnerClass {
private int innerField;
public void accessOuterField() {
System.out.println("Outer field value: " + outerField);
}
public void accessInnerField() {
System.out.println("Inner field value: " + innerField);
}
}
}
上述代码中,StaticInnerClass是OuterClass的静态内部类,可以访问OuterClass的静态成员变量outerField,但不能访问非静态成员变量。
在外部类中创建StaticInnerClass的示例代码如下:
OuterClass.StaticInnerClass innerObj = new OuterClass.StaticInnerClass();
使用类名.的方式来创建StaticInnerClass的实例。
示例1
下面是一个成员内部类和局部内部类联合使用的示例代码:
public class OuterClass {
private int outerField;
public void callInnerClasses() {
InnerClass1 innerObj1 = new InnerClass1();
innerObj1.accessOuterField();
int localVar = 3;
class LocalInnerClass {
public void printLocalVar() {
System.out.println("Local variable value: " + localVar);
}
}
LocalInnerClass innerObj2 = new LocalInnerClass();
innerObj2.printLocalVar();
}
public class InnerClass1 {
private int innerField1;
public void accessOuterField() {
System.out.println("Outer field value: " + outerField);
}
public void accessInnerField() {
System.out.println("Inner field value: " + innerField1);
}
public void callInnerClass2() {
InnerClass2 innerObj2 = new InnerClass2();
innerObj2.accessInnerField();
}
public class InnerClass2 {
private int innerField2;
public void accessInnerField() {
System.out.println("Inner field value: " + innerField2);
}
}
}
}
上述代码中,InnerClass1是OuterClass的成员内部类。InnerClass2是InnerClass1的成员内部类。在callInnerClasses()方法中,创建了InnerClass1和内部局部类LocalInnerClass的实例,并且访问了它们的成员变量和方法。InnerClass1的callInnerClass2()方法中,创建了InnerClass2的实例并访问了它的成员变量。
示例2
下面是一个使用匿名内部类的示例代码:
public interface MessageService {
void sendMessage(String message);
}
public class Foo {
public void sendMessage() {
MessageService messageService = new MessageService() {
public void sendMessage(String message) {
System.out.println("Sending message: " + message);
}
};
messageService.sendMessage("Hello, world!");
}
}
上述代码中,MessageService是一个接口,Foo类的sendMessage()方法创建了一个实现了MessageService接口的匿名内部类,实现了sendMessage()方法并打印了消息。然后,通过messageService.sendMessage()方法来发送消息。
以上就是JAVA内部类的详细讲解及示例代码。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA 内部类详解及实例 - Python技术站