Java 的内部类是什么?

Java中内部类(Inner Class)是指定义在另一个类中的类。内部类与外部类(Enclosing Class)相互依存,内部类可以访问外部类的私有成员和方法,而外部类也可以访问内部类的私有成员和方法。Java中内部类有四种类型:成员内部类、静态内部类、局部内部类和匿名内部类。

1、成员内部类(Member Inner Class):

成员内部类是定义在另一个类的内部,并且不是静态的内部类。它可以访问外部类的所有成员变量和方法,包括私有的。成员内部类可以被外部类的任意方法调用,也可以创建多个实例。成员内部类通常用来表示外部类的一种关联关系。

示例代码:

public class OuterClass {
    private int x = 10;
    class InnerClass {
        public void print() {
            System.out.println("x is " + x);
        }
    }
    public void test() {
        InnerClass inner = new InnerClass();
        inner.print();
    }
}

在上面的示例代码中,InnerClass是一个成员内部类,可以访问外部类的私有变量x,test()方法创建了一个InnerClass的实例inner并调用了它的print()方法。

2、静态内部类(Static Inner Class):

静态内部类是定义在另一个类的内部,并且是静态的内部类。它不能访问外部类的非静态成员,但可以访问外部类的静态成员。静态内部类可以通过外部类的类名直接访问,不需要创建外部类的实例。静态内部类通常用来表示外部类的一种辅助类或工具类。

示例代码:

public class OuterClass {
    private static int x = 10;
    static class InnerClass {
        public void print() {
            System.out.println("x is " + x);
        }
    }
    public static void test() {
        InnerClass inner = new InnerClass();
        inner.print();
    }
}

在上面的示例代码中,InnerClass是一个静态内部类,可以访问外部类的静态变量x,test()方法直接调用了InnerClass的print()方法。

3、局部内部类(Local Inner Class):

局部内部类是定义在方法内部的类,它只能在方法内部使用,不能在方法外部访问。局部内部类可以访问外部类的成员变量和方法,但只能访问被声明为final的局部变量。局部内部类通常用来表示方法内部的一种辅助类或工具类。

示例代码:

public class OuterClass {
    public void test() {
        final int x = 10;
        class InnerClass {
            public void print() {
                System.out.println("x is " + x);
               }
}
InnerClass inner = new InnerClass();
inner.print();

在上面的示例代码中,InnerClass是一个局部内部类,它只能在test()方法内部使用。它访问了外部类的局部变量x,因为x被声明为final,所以可以在局部内部类中访问。

4、匿名内部类(Anonymous Inner Class):

匿名内部类是没有名字的内部类,它通常用来表示一个接口或抽象类的实现,或者用来简化代码。匿名内部类必须继承一个类或实现一个接口,并且在创建对象的同时定义类或接口的实现。匿名内部类可以访问外部类的成员变量和方法,但只能访问被声明为final的局部变量。

示例代码:

public class OuterClass {
    public void test() {
        new Thread(new Runnable() {
            public void run() {
                System.out.println("Hello, world!");
            }
        }).start();
    }
}

在上面的示例代码中,创建了一个匿名内部类,它实现了Runnable接口的run()方法,并且在创建对象的同时定义了这个方法的实现。这个匿名内部类可以访问外部类的成员变量和方法,但没有定义任何内部状态。

总结一下,Java中的内部类可以用来表示不同的关联关系或者表示不同的功能实现。成员内部类和静态内部类通常用来表示外部类的一种关联关系或辅助类或工具类,局部内部类和匿名内部类通常用来简化代码或实现接口或抽象类的实现。

需要注意的是,内部类会增加代码的复杂度和阅读难度,因此应该根据实际情况来选择使用内部类还是外部类。同时,内部类也会增加内存开销和加载时间,因为每个内部类都会生成一个单独的.class文件,因此不应滥用内部类。

黑马程序员Java零基础视频教程_上部(Java入门,含斯坦福大学练习题+力扣算法题+大厂java面试题)

黑马程序员Java零基础视频教程_下部(Java入门,含斯坦福大学练习题+力扣算法题+大厂java面试题)

你可能感兴趣的:(java,python,开发语言)