Java-内部类:成员内部类、局部内部类、匿名内部类、静态内部类

news/2025/2/6 7:04:41/

文章目录

  • Java中的内部类
  • 一、成员内部类
    • 1. 成员内部类是什么?
    • 2. 为什么要使用成员内部类?
    • 3. 在哪里使用(场景)
    • 4. 优缺点
    • 5. 成员内部类示例代码
  • 二、局部内部类
    • 1. 是什么:
    • 2. 为什么使用
    • 3. 在哪里使用
    • 4. 优缺点
    • 5. 局部内部类示例代码:
  • 三、匿名内部类
    • 1. 什么是匿名内部类
    • 2. 为什么使用它?
    • 3. 在哪里使用
    • 4. 优缺点
    • 5. 匿名内部类示例代码:
  • 四、静态内部类
    • 1. 静态内部类是什么?
    • 2. 为什么设计出静态内部类?
    • 3. 在哪里使用它?
    • 4. 优缺点
    • 5. 示例代码:
  • 区别对比表格

Java中的内部类

一、成员内部类

1. 成员内部类是什么?

成员内部类是定义在外部类中的类,它可以访问外部类的属性和方法,并且可以通过外部类的实例来创建内部类的实例。
成员内部类可以用public、protected、private等访问修饰符进行修饰,具有与外部类相同的访问权限。
成员内部类可以访问外部类的私有成员,但是外部类不能直接访问成员内部类的私有成员,需要通过成员内部类的实例来访问。

2. 为什么要使用成员内部类?

成员内部类通常用于需要访问外部类信息并且不需要暴露给外部类的情况。使用成员内部类可以将相关的类组织在一起,提高代码的可读性和可维护性。
其主要优点如下:
访问外部类的私有成员;组织代码;实现多重继承;实现接口

总的来说,成员内部类可以方便地访问外部类的私有成员或方法,并且使得相关类组织在一起,提高了代码的可读性和可维护性。

3. 在哪里使用(场景)

成员内部类通常用于需要访问外部类的信息并且不需要暴露给外部类的情况,或者需要实现多重继承等特殊需求

4. 优缺点

(1)优点:

  1. 访问外部类的私有成员:成员内部类可以访问外部类的私有成员,这为实现某些功能提供了便利。

  2. 组织代码:成员内部类可以将相关的类组织在一起,从而提高代码的可读性和可维护性。

  3. 实现多重继承:由于Java不支持多重继承,通过成员内部类可以实现多重继承的效果。

  4. 实现接口:成员内部类可以实现一个接口,并且可以达到隐藏实现细节的效果。

(2)缺点:
会增加代码的复杂度,导致代码难以维护。

5. 成员内部类示例代码

public class Outer {private int value = 100;public class Inner {public void print() {System.out.println(value);}}public void test() {Inner inner = new Inner();inner.print();}
}

二、局部内部类

1. 是什么:

局部内部类是定义在方法内部的内部类,它只在所在的方法内部可见,外部其他方法和类无法访问。与成员内部类不同,局部内部类不能有任何访问修饰符(如public、protected、private),因为它的作用域仅限于方法内部
局部内部类可以访问外部类的所有成员,包括私有成员和方法。在局部内部类中访问外部类成员的方式与成员内部类相同,即通过外部类的对象来访问。

2. 为什么使用

局部内部类通常用于解决某些复杂问题,例如需要在方法内部实现某种接口或者继承某个类,或者需要访问方法的局部变量等情况。由于局部内部类只在方法内部可见,因此可以避免其他方法或类访问这些复杂的内部类,从而提高代码的安全性和可读性。

3. 在哪里使用

一般情况下,如果需要封装和隐藏某个类或接口的实现细节,我们都会考虑使用局部内部类。具体来说:

  1. 当需要实现某个接口,并且这个接口只需要在当前方法内部使用,就可以使用局部内部类来实现。

  2. 当需要获取某个方法的局部变量时,可以定义一个局部内部类,并把局部变量传递给局部内部类的构造方法,这样就可以通过局部内部类来获取局部变量的值,而无需将局部变量声明为 final。

  3. 当需要对某个方法的返回值进行扩展时,可以使用局部内部类,它可以继承某个类或实现某个接口,并重写相关方法。

4. 优缺点

(1)局部内部类的优点:

实现了代码的封装和隐藏,可以减少代码的耦合度,提高代码的灵活性和可维护性。
可以访问外部类的所有成员变量和方法。
可以访问方法中的局部变量,同时不需要将局部变量声明为 final 类型。
(2)局部内部类的缺点:

局部内部类只能在当前方法内部使用,无法在其他方法或类中使用,因此代码的可重用性受到限制。
局部内部类的代码的可读性和可维护性相对较差,因为代码分散在多个位置,需要跳转才能查看整个程序的执行流程,比较容易混淆。
局部内部类的作用域较小,在方法执行完毕后就会被销毁,因此如果需要在方法外部使用局部内部类的对象,则需要在方法内部将其传递到方法外部,或返回其引用。

5. 局部内部类示例代码:

public class Outer {private int value = 100;public void test() {class Inner {public void print() {System.out.println(value);}}Inner inner = new Inner();inner.print();}
}

三、匿名内部类

1. 什么是匿名内部类

匿名内部类是一种没有名字的局部内部类,它通常用于只需要使用一次的场合,可以在创建对象的同时实现该对象的方法。匿名内部类通常使用在接口或抽象类的实现、事件处理等场合。
匿名内部类是一种没有名字的局部内部类,它通常用于只需要使用一次的场合,可以在创建对象的同时实现该对象的方法。匿名内部类通常使用在接口或抽象类的实现、事件处理等场合。

匿名内部类的语法格式为:

new 父类构造器/接口() {// 匿名内部类的类体部分
}

其中,父类构造器/接口指定了匿名内部类实例的类型,类体部分则包含该实例的具体实现。

需要注意的是,匿名内部类不具有构造方法,因此不能定义构造函数,但可以在类体部分中实现实例初始化块和成员变量。

2. 为什么使用它?

匿名内部类的出现主要是为了简化代码,避免在代码中创建过多的类,特别是对于只需要使用一次的类。相比于使用普通的内部类或定义新的类,使用匿名内部类可以减少代码的数量和复杂度,提高代码的可读性和可维护性。

3. 在哪里使用

通常使用在需要实现接口或继承一个类的情况下。
例如,在事件处理中,需要实现一个接口并重写其中的方法,但由于每个事件的处理方式可能不同,因此需要创建多个类来实现。使用匿名内部类可以将这些操作合并在一起,从而提高代码的可读性和可维护性。

4. 优缺点

(1)匿名内部类的优点:

  1. 简化代码:使用匿名内部类可以避免创建过多的类,特别是只需要使用一次的类,可以减少代码的数量和复杂度。

  2. 提高代码可读性和可维护性:将某些操作合并在一起可以提高代码的可读性和可维护性,代码更加简洁、灵活。

  3. 可以访问其他方法中的变量:与普通内部类不同的是,匿名内部类可以访问其他方法中的变量,从而具有更大的灵活性和通用性。

(2)匿名内部类的缺点:

  1. 只能使用一次:由于匿名内部类只能使用一次,因此不能重复使用。

  2. 不方便进行单元测试:由于匿名内部类通常是在方法中定义的,因此不方便进行单元测试。

  3. 可读性较差:由于匿名内部类没有名称,因此在代码中阅读时可能不太直观。

  4. 不能定义构造函数:匿名内部类没有构造函数,因此无法进行初始化操作。

需要根据具体情况进行选择。

5. 匿名内部类示例代码:

public class Outer {public void test() {new Thread(new Runnable() {public void run() {System.out.println("Thread is running.");}}).start();}
}

四、静态内部类

1. 静态内部类是什么?

静态内部类是一种嵌套在外部类中且用 static 修饰的内部类。与非静态内部类不同的是,静态内部类可以直接通过外部类名访问,无需依赖于外部类的实例。静态内部类与外部类的关系类似于普通类与其他普通类的关系,因此静态内部类可以具有普通类的所有特性,如继承、实现接口、静态成员等。

2. 为什么设计出静态内部类?

Java语言中静态内部类的设计主要是为了解决以下问题:

  1. 代码重用性:静态内部类可以被看作外部类的一部分,因此可以在外部类的不同方法中复用静态内部类。

  2. 封装性:将一些与外部类关联的类定义为外部类的静态内部类,可以使这些类仅对外部类可见,从而增加了封装性。

  3. 可读性:将某些与外部类关系密切的类定义为静态内部类,可以使代码更加清晰、易于理解,提高了代码的可读性。

  4. 代码结构清晰:静态内部类的使用可以使代码结构更加清晰,不会像普通类一样在同一个包中出现大量与外部类无关的类。

总之,静态内部类的设计增强了Java语言的面向对象特性,使代码更加灵活、可维护和易读。

3. 在哪里使用它?

通常使用在一个类需要访问另一个类的静态成员的情况下。

4. 优缺点

(1)优点:可以访问外部类的静态成员,可以隐藏自己的实现细节。

(2)缺点:会增加代码的复杂度,导致代码难以维护。

5. 示例代码:

public class Outer {private static int value = 100;public static class Inner {public void print() {System.out.println(value);}}public static void test() {Inner inner = new Inner();inner.print();}
}

区别对比表格

以下是从多个维度对成员内部类、局部内部类、匿名内部类、静态内部类进行区分的表格:

特性成员内部类局部内部类匿名内部类静态内部类
所属类外部类的成员外部类的方法或作用域内外部类的方法或作用域内外部类的成员
是否有访问修饰符可以有不可以有不可以有可以有
是否可以访问外部类的成员可以访问可以访问外部类的静态成员可以访问外部类的成员可以访问外部类的静态成员
是否有this关键字可以使用this可以使用this可以使用this不能使用this
是否可以被继承可以被继承不能被继承不能被继承可以被继承
是否可以有构造方法可以有可以有不能有可以有
是否可以访问外部类的私有成员可以访问不可以访问不可以访问可以访问
是否可以定义静态成员可以定义静态和非静态成员不可以定义静态成员不可以定义静态成员只可以定义静态成员
是否可以有名称可以有可以有不能有可以有

以上表格只列出了成员内部类、局部内部类、匿名内部类、静态内部类的一些特性。实际上,这四种内部类还具有更多不同的特性和用法,需要根据具体情况进行选择和使用。
在这里插入图片描述


http://www.ppmy.cn/news/1070833.html

相关文章

【人工智能】—_贝叶斯网络、概率图模型、全局语义、因果链、朴素贝叶斯模型、枚举推理、变量消元

文章目录 频率学派 vs. 贝叶斯学派贝叶斯学派Probability(概率):独立性/条件独立性:Probability Theory(概率论):Graphical models (概率图模型)什么是图模型(Graphical Models&…

vs2008下的mfc hello world实现

笔者不知道会写这种博文,好久没写mfc程序,hello world都不会创建了。起因是来了个mfc任务,那就得把mfc熟悉起来,先看下实现效果吧 因为是基于2008的,那就按照2008创建吧 文章目录 第一步:文件新建项目第二…

Blender界面学习02

学习视频 【基础篇】1.3 认识界面_哔哩哔哩_bilibili 基本的3d建模的流程是什么? 四个角现出加号时可以拆分窗口,也可以合并窗口 向自己的方向拉是合并,向不是自己的方向拉是合并 如果界面搞乱后需要回到原来的布局 然后在新建的布局上右击 …

input子系统

内核分三层 1、事件处理层 2、核心层 3、设备驱动层 当硬件按下,在设备驱动中触发中断,中断程序会将事件上报给核心层 核心层将事件给事件处理层,最后事件处理层控制app应用层的怎么操作将数据发送到用户空间

thinkphp6如何将需要记录的日志单独记录到一个日志中

如何将需要记录的日志单独记录到一个日志中 有时候需要将具体情况的日志统一记录到单一的类目中方便查看。比如支付日志,回调日志。可以使用通道解决方法。 1.日志通道channel 将配置不同的日志通道,将不同的日志记录到不同的日志中 使用方法&#xf…

web、HTTP协议

目录 一、Web基础 1.1 HTML概述 1.1.1 HTML的文件结构 1.2 HTML中的部分基本标签 1.3 URI 和 URL 二.HTTP协议 2.1.HTTP概念 2.2.HTTP协议版本 2.3.HTTP请求方法 2.4.HTTP请求访问的完整过程 2.5.HTTP状态码 2.6.HTTP请求报文和响应报文 2.7.HTTP连接优化 三.HTT…

一个人多店操作?Shopee知虾多店聊聊有哪些优势?

Shopee知虾多店聊聊是一款为Shopee商家提供全面解决方案的应用程序。Shopee知虾多店聊聊主要致力于解决商家在Shopee平台上的客服对接问题。 以下是Shopee知虾多店聊聊的主要功能和优势: 多端同时登录:Shopee知虾多店聊聊支持多个端口同时登录&#xff0…

C语言——类型转换

数据有不同的类型,不同类型数据之间进行混合运算时涉及到类型的转换问题。 转换的方法有两种: 自动转换(隐式转换):遵循一定的规则,由编译系统自动完成强制类型转换:把表达式的运算结果强制转换成所需的数据类型 语法格…