江明涛的博客
Java中的内部类
Java中的内部类

Java中的内部类

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中的内部类可以访问外部类的成员,包括私有成员。成员内部类是定义在外部类的内部的类,局部内部类是定义在方法或作用域内的类,而匿名内部类则是没有名字的内部类。每种类型的内部类都有其适用的场景,可以根据实际需求选择使用。