Java中类的成员——内部类

Java中类的成员——内部类

在Java中,类的成员除了我们常见的字段(变量)和方法之外,还有一种特殊的成员,那就是内部类。内部类就是定义在另一个类内部的类。使用内部类可以隐藏不想暴露给外界的实现细节,提高代码的组织性和可读性。接下来,我们将通过简单的例子和代码注释来详细解释内部类的概念和用法。

一、内部类的基本概念

内部类可以是静态的,也可以是非静态的。静态内部类不依赖于外部类的实例,而非静态内部类则依赖于外部类的实例。

二、静态内部类

静态内部类定义在外部类中,使用static关键字修饰。静态内部类只能访问外部类的静态成员。

public class OuterClass {
    // 外部类的静态成员变量
    static int outerStaticVar = 100;

    // 静态内部类
    static class StaticInnerClass {
        void display() {
            // 访问外部类的静态成员变量
            System.out.println("StaticInnerClass accessing outerStaticVar: " + outerStaticVar);
        }
    }

    public static void main(String[] args) {
        // 创建静态内部类的对象,不需要外部类的实例
        StaticInnerClass innerObj = new StaticInnerClass();
        innerObj.display(); // 输出:StaticInnerClass accessing outerStaticVar: 100
    }
}

三、非静态内部类(成员内部类)

非静态内部类(或称为成员内部类)定义在外部类中,不使用static关键字。非静态内部类可以访问外部类的所有成员(包括静态和非静态成员)。创建非静态内部类的对象时,必须依赖外部类的实例。

public class OuterClass {
    // 外部类的非静态成员变量
    int outerVar = 200;

    // 非静态内部类(成员内部类)
    class MemberInnerClass {
        void display() {
            // 访问外部类的非静态成员变量
            System.out.println("MemberInnerClass accessing outerVar: " + outerVar);
        }
    }

    public static void main(String[] args) {
        // 创建外部类的实例
        OuterClass outerObj = new OuterClass();
        // 创建非静态内部类的对象,需要外部类的实例
        MemberInnerClass innerObj = outerObj.new MemberInnerClass();
        innerObj.display(); // 输出:MemberInnerClass accessing outerVar: 200
    }
}

在上面的代码中,注意创建非静态内部类对象的方式:outerObj.new MemberInnerClass()。这是因为非静态内部类依赖于外部类的实例,所以需要使用外部类实例来创建内部类对象。

四、局部内部类

局部内部类定义在方法或代码块中。它的作用域被限制在定义它的方法或代码块中。局部内部类只能访问该方法或代码块中的局部变量(这些变量必须是final的,在Java 8及以后的版本中,这个限制已经被放宽)。

public class OuterClass {
    public void showMessage() {
        // 局部内部类
        class LocalInnerClass {
            void display() {
                System.out.println("This is a local inner class.");
            }
        }
        
        // 在方法内部创建局部内部类的对象
        LocalInnerClass localInnerObj = new LocalInnerClass();
        localInnerObj.display(); // 输出:This is a local inner class.
    }

    public static void main(String[] args) {
        OuterClass outerObj = new OuterClass();
        outerObj.showMessage(); // 调用方法,执行局部内部类的相关代码
    }
}

五、匿名内部类

匿名内部类是没有名字的内部类,通常用于实现接口或继承父类并创建对象。它经常用于一次性的对象创建,例如在启动线程或注册监听器时。

interface MyInterface {
    void doSomething();
}

public class OuterClass {
    public static void main(String[] args) {
        // 匿名内部类实现接口
        MyInterface myObj = new MyInterface() {
            @Override
            public void doSomething() {
                System.out.println("Doing something in anonymous inner class.");
            }
        };
        
        myObj.doSomething(); // 输出:Doing something in anonymous inner class.
    }
}

六、总结

内部类是Java编程中一个强大的工具,它可以让我们更灵活地组织代码,隐藏实现细节,并创建更简洁的API。内部类有多种类型,包括静态内部类、非静态内部类(成员内部类)、局部内部类和匿名内部类,每种类型都有其特定的用途和创建方式。

通过上面的例子,我们可以总结以下几点:

  1. 静态内部类:不依赖于外部类的实例,可以访问外部类的静态成员。创建静态内部类的对象时不需要外部类的实例。

  2. 非静态内部类(成员内部类):依赖于外部类的实例,可以访问外部类的所有成员(静态和非静态)。创建非静态内部类的对象时,必须依赖外部类的实例。

  3. 局部内部类:定义在方法或代码块中,作用域仅限于定义它的方法或代码块。可以访问该方法或代码块中的局部变量(这些变量可以是final的,或者从Java 8开始,可以是有效的final)。

  4. 匿名内部类:没有名字的内部类,通常用于实现接口或继承父类并立即创建对象。常用于一次性对象创建,如线程启动或事件监听。

内部类提供了更多的封装和灵活性,但也可能会增加代码的复杂性。因此,在使用内部类时,我们需要权衡其带来的好处和可能带来的维护成本。

最后,为了加深理解,建议读者多实践,尝试在不同的场景下使用内部类,并思考如何更好地利用它们来优化代码结构和提高代码的可读性。

希望这篇文章能帮助初学者更好地理解和使用Java中的内部类。随着学习的深入,你会发现内部类在Java编程中的广泛应用和重要性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/583557.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[iOS]组件化开发

一、组件化开发基础 1.组件定义 在软件开发中,一个组件是指一个独立的、可替换的软件单元,它封装了一组相关的功能。组件通过定义的接口与外界交互,并且这些接口隔离了组件内部的实现细节。在Swift语言中,组件可以是一个模块、一…

CCF-CSP真题题解:201312-2 ISBN号码

201312-2 ISBN号码 #include <iostream> #include <cstring> #include <algorithm> using namespace std;string s;int main() {cin >> s;int num 0;for (int i 0, p 1; i < s.size() - 1; i)if (s[i] ! -) {num (s[i] - 0) * p;p;}num % 11;ch…

win11 自带分区磁盘管理,右键U盘 删除卷,显示不支持该请求

win11 自带分区磁盘管理&#xff0c;右键U盘 删除卷&#xff0c;显示不支持该请求&#xff0c;打开cmd 输入下面命令 1.diskpart 2.list disk 3.sel disk (U盘盘符编号) 4.clean

Linux vi\vim编辑器

vi/vim编辑器 一、vi\vim 编辑器的三种工作模式1.命令模式&#xff08;Command mode&#xff09;2.输入模式&#xff08;Insert mode&#xff09;3.底线命令模式&#xff08;Last line mode&#xff09; 二、参考 vi\vim 是 visual interface 的简称&#xff0c;是 Linux 中最经…

Tcp 协议的接口测试

首先明确 Tcp 的概念&#xff0c;针对 Tcp 协议进行接口测试&#xff0c;是指基于 Tcp 协议的上层协议比如 Http &#xff0c;串口&#xff0c;网口&#xff0c; Socket 等。这些协议与 Http 测试方法类似&#xff08;具体查看接口自动化测试章节&#xff09;&#xff0c;但在测…

大数据计算引擎中的Calcite

1.Calcite介绍 Calcite是一个动态数据库管理框架&#xff0c;具备数据库管理系统的功能 Calcite具备SQL解析、校验、优化、生成、连接查询等功能 Calcite能够为不同平台和数据源提供统一的查询引擎 2.Calcite能力 比如&#xff0c;对于HBase而言&#xff0c;没有SQL查询的能力…

Qt 6 开源版(免费) -- 安装图解

Qt6起&#xff0c;两项重大改变&#xff08;并非指技术&#xff09;&#xff1a; 必须在线安装&#xff0c;不再提供单独的安装包主推收费的商业版 当然的&#xff0c;为了引流、培养市场&#xff0c;提供了一个免费的开源版本。 开源版相对于收费的商业版&#xff0c;主体是…

PostgreSQL 14 向量相似度搜索插件 (pgvector) 安装指南

本文是关于在 PostgreSQL 14 中安装并使用向量相似度搜索插件(pgvector)的详细指南。此插件允许用户在数据库中执行高效的向量运算,特别适用于机器学习模型的向量数据存储与检索场景。 环境需求 已安装PostgreSQL 14或更高版本。安装了Visual Studio 2022,用于编译插件。安装…

微信小程序+esp8266温湿度读取

本文主要使用微信小程序显示ESP8266读取的温湿度并通过微信小程序控制LED灯。小程序界面如下图所示 原理讲解 esp8266 通过mqtt发布消息,微信小程序通过mqtt 订阅消息,小程序订阅后,就可以实时收到esp8266 传输来的消息。 个人可免费注册五个微信小程序账号,在微信小程序官…

渗透之sql注入---实战1

本期的sql注入实战在&#xff1a;BUUCTF在线评测 (buuoj.cn) 该网站上进行。 启动靶机&#xff1a; 1.进来后搜索web1 2.点击【SWPU2019】Web1启动靶机。 3.进来之后在此界面进行注入。 开始注入&#xff1a; 1.找注入点&#xff1a; 我们输入1 后查看广告详情发现报错&a…

利用kimi等大模型进行运维参数解析和调优

在运维时&#xff0c;经常遇到很多参数&#xff0c;有些参数不知道意义&#xff0c;知道意义的也有些不知道合理参考值是多少。利用kimi等大模型来当老司机&#xff0c;轻松解决运维难题。 例如在运维hive参数时&#xff0c;有些不知道作用&#xff0c;提示次如下 你的角色是…

vue根据输入n动态生成n个表单

我的构想&#xff1a;在输入框中输入一个数字n&#xff0c;然后点击一个按钮&#xff0c;弹出一个弹窗&#xff0c;里面有n个表单。 这是按钮的vue代码&#xff1a;数值保存在form.number里面&#xff0c;每次数字改变会触发numberChange //...略 <el-form-item prop"…

POCEXP编写—多线程

POC&EXP编写—多线程 1. 前言2. 多进程&多线程2.1. 多进程2.1.1. 案例 2.2. 多线程2.2.1. 案例&#xff1a; 2.3. POC的案例&#xff08;模板&#xff09; 3. UA头设置3.1. 随机UA头3.1.1. 案例3.1.2. 模板拼接 4. 代理Proxy4.1. 单代理案例4.2. 多代理案例4.2.1. 请求…

【2024最叼教程】Appium自动化环境搭建保姆级教程

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

鸿蒙内核源码分析(线程概念篇) | 是谁在不断的折腾CPU

本篇说清楚任务的问题 在鸿蒙内核线程(thread)就是任务(task)&#xff0c;也可以叫作业.线程是对外的说法&#xff0c;对内就叫任务.跟王二毛一样&#xff0c; 在公司叫你王董&#xff0c;回到家里还有领导&#xff0c;就叫二毛啊.这多亲切.在鸿蒙内核是大量的task&#xff0c…

【Linux系列】 离线安装vnc 可视化桌面

离线安装vnc 可视化桌面 缘下载安装vnc初始化链接 缘 项目需要下载 下载地址&#xff1a; http://mirror.centos.org/centos/7/updates/x86_64/Packages/tigervnc-license-1.8.0-31.el7_9.noarch.rpm http://mirror.centos.org/centos/7/os/x86_64/Packages/libXfont2-2.0.…

Word插件开发

VSTO是Visual Studio Tools for Office的简称&#xff0c;它是Microsoft Visual Studio的一个扩展&#xff0c;用于开发基于Microsoft Office平台的应用程序。VSTO提供了一套API和工具&#xff0c;使开发人员能够利用Visual Studio IDE来开发定制的Office解决方案。 在 Visual…

DiffusionGAN ——最快的小波扩散模型应用研究

介绍 扩散模型最近出现并迅速发展&#xff0c;吸引了许多研究人员的兴趣。这些模型能从随机的噪声输入生成高质量的图像。在图像生成任务中&#xff0c;它们的表现尤其优于最先进的生成模型&#xff08;GANs&#xff09;。扩散模型可以灵活地处理各种条件输入&#xff0c;从而…

knife4j swagger 使用笔记

1.接口访问的端口跟后台设置的不一致&#xff0c;接口请求无反应 处理办法 2.响应参数不显示问题 &#xff08;1&#xff09;返回的参数里面一定要有响应的参数对象&#xff0c;如下&#xff1a; &#xff08;2&#xff09;TableDataInfo 定义成泛型类 TableDataInfo package…

移动应用安全

移动应用安全 移动应用安全主要关注Android、iOS、Windows Phone等平台上移动应用软件安全状态。它涉及应用程序在其设计运行的平台上下文中的安全问题、它们使用的框架以及预期的用户集。所有主流的移动平台都提供大量可选的安全控制&#xff0c;旨在帮助软件开发人员构建安全…
最新文章