Java中的内部类是指一个类定义在另一个类内部的类。内部类可以分为成员内部类、局部内部类和匿名内部类。
成员内部类
成员内部类是定义在外部类的内部的一个类。它可以访问外部类的所有成员,包括私有成员。
public class Outer {
private int x = 10;
public class Inner {
public void display() {
System.out.println("x = " + x);
}
}
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.display();
}
}
在上面的示例中,Outer是外部类,Inner是内部类。我们在main方法中创建了一个Outer对象outer,然后再创建了一个Inner对象inner。通过outer来创建inner的语法是outer.new Inner()
。通过内部类对象inner调用display方法,可以访问到外部类的私有成员x。
局部内部类
局部内部类是定义在方法或作用域内的内部类。它只在定义它的方法或作用域内可见。
public class Outer {
private int x = 10;
public void display() {
class Inner {
public void print() {
System.out.println("x = " + x);
}
}
Inner inner = new Inner();
inner.print();
}
public static void main(String[] args) {
Outer outer = new Outer();
outer.display();
}
}
在上面的示例中,Inner是一个局部内部类,它定义在display方法内部。我们在display方法中创建了一个Inner对象inner,并调用了它的print方法。inner对象可以访问到外部类的私有成员x。
匿名内部类
匿名内部类是没有名字的内部类。它通常用于创建一次性的、只需要用一次的类实例。
public interface Greeting {
void sayHello();
}
public class Outer {
public void greet() {
Greeting greeting = new Greeting() {
public void sayHello() {
System.out.println("Hello!");
}
};
greeting.sayHello();
}
public static void main(String[] args) {
Outer outer = new Outer();
outer.greet();
}
}
在上面的示例中,Greeting是一个接口,Outer是外部类,我们通过匿名内部类实现了Greeting接口的sayHello方法。在greet方法中,我们创建了一个实现了Greeting接口的匿名内部类的实例greeting,然后调用它的sayHello方法。
总结:Java中的内部类可以访问外部类的成员,包括私有成员。成员内部类是定义在外部类的内部的类,局部内部类是定义在方法或作用域内的类,而匿名内部类则是没有名字的内部类。每种类型的内部类都有其适用的场景,可以根据实际需求选择使用。