Java内部类
  TEZNKK3IfmPf 2023年11月12日 23 0

Java内部类

Java内部类(Inner Class)是指定义在另一个类内部的类,它允许在一个类的内部定义另一个类。内部类可以访问外部类的成员变量和方法,并且可以用来实现一些特定的功能。

Java内部类(Inner Class)可以分为四种类型:成员内部类(Member Inner Classes)、静态内部类(Static Nested Classes)、局部内部类(Local Inner Classes)和匿名内部类(Anonymous Inner Classes):

• 成员内部类:定义在外部类的成员变量位置,并且可以访问外部类的成员变量和方法。

• 静态内部类:定义在外部类的静态变量位置,并且可以拥有自己的静态变量和方法。

• 局部内部类:定义在外部类的方法体内,作用域通常被限制在该方法中。

• 匿名内部类:没有名称的内部类,通常用来简化代码,在创建线程、事件处理等方面被广泛使用。

 

需要注意的是,在创建成员内部类对象时,必须先创建外部类对象,再使用外部类对象来创建成员内部类对象。因为成员内部类的存在依赖于外部类对象。

每种类型的介绍和注意事项

成员内部类(Member Inner Classes)

成员内部类是定义在另一个类中的类。它可以访问该外部类的所有成员变量和方法,即使它们被声明为私有。可通过以下步骤创建成员内部类:

1. 在外部类中使用关键字 class 创建一个成员内部类。

2. 调用外部类的构造函数或方法来创建成员内部类对象。

3. 可以使用 new 运算符创建成员内部类对象。

注意事项:

• 内部类可以使用外部类的 private 成员(包括私有方法和变量)。

• 外部类不能直接访问内部类的成员。在外部类中,必须先创建内部类对象,然后才能访问内部类的成员。

• 使用内部类时应仔细考虑垃圾回收问题。如果内部类对象在外部类对象之外引用,则可能会导致内存泄漏。

 

静态内部类(Static Nested Classes)

静态内部类是静态声明的类,与外部类实例无关。它与其他静态成员类似,可以通过类名引用。

可通过以下步骤创建静态内部类:

1. 在外部类中使用关键字 static 和 class 创建一个静态内部类。

2. 使用外部类的名称和点运算符来访问静态内部类。

注意事项:

• 静态内部类不能直接访问外部类的非静态成员。要访问外部类的非静态成员,需要首先创建外部类对象。

• 可以将静态内部类用作外部类的辅助类,但是,如果静态内部类不依赖于外部类实例,则最好将其声明为静态成员。

• 因为静态内部类不引用外部类实例,因此它可以防止内存泄漏等问题。

 

局部内部类(Local Inner Classes)

局部内部类是在代码块、方法或构造函数中定义的类。它只在该块中可见,并且通常用于解决特定问题。

可通过以下步骤创建局部内部类:

1. 在代码块、方法或构造函数中使用关键字 class 创建一个局部内部类。

2. 调用该块的方法或构造函数来创建局部内部类对象。

注意事项:

• 局部内部类不能用 public、protected 或 private 修饰。

• 局部内部类只能在声明它的块中实例化。

• 可以访问外部类的所有成员,包括私有成员。

 

匿名内部类(Anonymous Inner Classes)

匿名内部类是没有名称的局部内部类。它通常在创建对象时使用,并且只能实例化一次。

可通过以下步骤创建匿名内部类:

1. 使用关键字 new 和要实现的接口或继承的基类来创建一个对象。

2. 在大括号中编写代码块实现接口或继承的基类的方法。

注意事项:

• 匿名内部类通常用于事件处理程序和回调函数中。

• 不能为匿名内部类定义构造函数。

• 可以访问外部类的成员变量和方法,但只能访问最终变量(也就是值不会改变的变量)。

• 匿名内部类可以实现接口或继承一个类,但不能同时实现接口和继承一个类。

• 如果要在匿名内部类中使用一个局部变量,则该变量必须声明为 final。

这些注意事项可以帮助我们更好地理解和使用Java中的内部类。

 

下面给出一个Java内部类例子源码:

public class OuterClass {
    private int num = 10;
    private static int staticNum = 20;

    public void outerMethod() {
        System.out.println("Outer method");

        // 局部内部类
        class LocalInnerClass {
            public void localMethod() {
                System.out.println("Local method");
            }
        }

        LocalInnerClass localInnerObj = new LocalInnerClass();
        localInnerObj.localMethod();

        // 匿名内部类
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("Anonymous inner class");
            }
        };

        Thread thread = new Thread(runnable);
        thread.start();
    }

    // 成员内部类
    public class InnerClass {
        public void display() {
            System.out.println("num = " + num);
            System.out.println("staticNum = " + staticNum);

            outerMethod(); // 访问外部类方法
        }
    }

    // 静态内部类
    public static class StaticInnerClass {
        public void print() {
            System.out.println("Static inner class");
            System.out.println("staticNum = " + staticNum);
        }
    }

    public static void main(String[] args) {
        OuterClass outerObj = new OuterClass();
        InnerClass innerObj = outerObj.new InnerClass();
        innerObj.display();

        StaticInnerClass staticInnerObj = new StaticInnerClass();
        staticInnerObj.print();
    }
}

编译运行输出结果为:

num = 10
staticNum = 20
Outer method
Local method
Static inner class
staticNum = 20
Anonymous inner class

 

注意,内部类的作用域:内部类可以访问外部类的所有成员变量和方法,包括私有成员。但是,外部类不能直接访问内部类的成员变量和方法。此外,在不同的内部类之间也不能相互访问。

 

顺便提示,不要混淆了内部类(Inner Class)和嵌套类(Nested Class)

Java中的嵌套类(Nested Class)包括两种类型:静态嵌套类(Static Nested Class)和非静态嵌套类(Non-Static Nested Class)。非静态嵌套类(Non-Static Nested Class)是内部类(Inner Class)的一种,但是内部类并不全都是非静态嵌套类,非静态嵌套类属于内部类的一个子集。非静态嵌套类分为四种类型:成员内部类(Member Inner Class)、局部内部类(Local Inner Class)、匿名内部类(Anonymous Inner Class)和方法内部类(Method Local Inner Class)。

附录、进一步学习了解

Java的内部类是什么? - 知乎

彻底理解内部类的使用(详细篇) - 掘金

Java内部类(一篇就够)_java 内部类_赶路人儿的博客-CSDN博客

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月12日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   20天前   44   0   0 java
  TEZNKK3IfmPf   2024年05月31日   54   0   0 java
TEZNKK3IfmPf