【从零开始学习JAVA | 第十九篇】初识内部类

news2024/11/19 15:34:37

前言:

内部类是类的五大成员。一个类的其他的成员分别是属性,方法,构造方法,代码块。本文将详细介绍什么是内部类,以及内部类的意义。

内部类:

内部类(Inner Class)是 Java 中的一个特殊概念,它指的是一个类定义在另一个类内部的类。内部类可以访问外部类的成员,包括私有的成员和方法。内部类还可以访问同一个外部类中其他内部类的成员。内部类是 Java 实现面向对象的一个重要机制,常用于事件驱动编程中。

Java 中内部类的分类有以下几种:

1. 成员内部类:定义在外部类中,但是在外部类的成员方法之外。
2. 静态内部类:定义在外部类中,但是在外部类的静态方法中或者外部类的静态区域中。
3. 局部内部类:定义在外部类的方法体中或者一个作用域内。

下面是一个成员内部类的示例:


public class Outer {
    private int num = 1;
    private String name = "Outer";
    public class Inner {
        public void print() {
            System.out.println("num is " + num + ", name is " + name);
        }
    }
}

在以上代码中,定义了外部类 `Outer` 和成员内部类 `Inner`,`Inner` 类可以访问 `Outer` 类中的私有成员 `num` 和 `name`。

下面是一个示例程序,演示如何创建和使用成员内部类:

public class Test {
    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        inner.print();
    }
}

在以上示例中,首先创建了外部类 `Outer` 的实例 `outer`,然后使用实例 `outer` 创建了内部类 `Inner` 的实例 `inner`,最后调用 `inner` 的方法 `print()` 输出结果。

总之,内部类是 Java 实现面向对象编程的重要机制,可以访问外部类的成员和方法,是实现一些事件驱动或者复杂逻辑的必要手段之一。

内部类的分类:

1.成员内部类:

成员内部类是和外部类的成员变量和方法平级的,可以访问外部类的所有变量和方法,它的定义方式如下:

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

上面的代码定义了一个 Outer 类和一个 Inner(Nested) 类,在 Outer 类中定义了一个成员内部类 Inner,它可以访问 Outer 类中的 data 变量。

使用成员内部类的方式如下:

Outer outer = new Outer();
outer.method(); // 输出 "0"

2. 静态内部类

静态内部类是在外部类内部定义的一个静态类,它独立于外部类的对象,也就是说,即使没有创建外部类的对象,我们仍然可以使用静态内部类,静态内部类的定义方式如下:

public class Outer {
    private static int data;
    public static class Inner {
        public void print() {
            System.out.println(data);
        }
    }
}

使用静态内部类的方式如下:

Outer.Inner inner = new Outer.Inner();
inner.print(); // 输出 "0"

这里需要注意,静态内部类中只能访问外部类的静态变量或静态方法。

3. 局部内部类

局部内部类是定义在方法内部的内部类,只能在该方法内部使用,它的定义方式如下:


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

上面的代码定义了一个局部内部类 Inner,它可以访问外部类中的 data 变量。

使用局部内部类的方式如下:


Outer outer = new Outer();
outer.method(); // 输出 "0"

4. 匿名内部类

匿名内部类是没有名字的内部类,只能一次性使用,它通常用于实现接口和抽象类的方法,它的定义方式如下:


public interface MyInterface {
    void method();
}

public class MyClass {
    public void print() {
        MyInterface myInterface = new MyInterface() {
            public void method() {
                System.out.println("Hello World");
            }
        };
        myInterface.method();
    }
}

上面的代码中,MyInterface 是一个接口,MyClass 中 print() 方法中使用了匿名内部类实现了 MyInterface 的 method() 方法。

使用匿名内部类的方式如下:

MyClass myClass = new MyClass();
myClass.print(); // 输出 "Hello World"

以上是几种常见的内部类的定义和使用方式,内部类的使用非常灵活,可以通过内部类实现许多功能,并且它具有访问外部类私有成员的能力,但是由于内部类的存在,代码的可读性和可维护性会相应降低,因此应该谨慎使用。

总结:

内部类的出现进一步扩展了类的功能,使得类的功能更加丰富,内部类的种类繁多,但我们对于这一块只要求掌握就可以了,不必做过深的研究。

如果我的内容对你有帮助,请点赞,评论,收藏创作不易,大家的支持就是我坚持下去的动力!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MedViT:一种用于广义医学图像分类的鲁棒Vision Transformer

文章目录 MedViT: A Robust Vision Transformer for Generalized Medical Image Classification摘要本文方法Locally Feed-Forward Network 实验实验结果 MedViT: A Robust Vision Transformer for Generalized Medical Image Classification 摘要 卷积神经网络(cnn)在现有医…

实现一个 AI 驱动的马里奥(使用双重深度 Q 网络),它可以自己玩游戏

训练玩马里奥的 RL 智能体 本教程将向您介绍深度强化学习的基础知识。 最后,您将实现一个 AI 驱动的马里奥(使用双重深度 Q 网络),它可以自己玩游戏。 # !pip install gym-super-mario-bros7.3.0import torch from torch import …

STM32实现延时

在STM32单片机中,实现延时一般都是使用定时器,既可以使用Systick定时器,也可以使用常规的定时器。 定时器在设置了定时并开启之后,就会进入自主运行模式,其中,初始化设置这一阶段是由CPU执行相应指令完成的…

Spring Cloud_Spring Cloud Alibaba_00000

contents 微服务介绍版本选择创建项目创建Maven工程 说明 微服务介绍 微服务架构是一种架构模式。它提倡将单一应用程序划分成一组小的服务。服务之间相互协调、相互配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通…

html通过web3JS 获取当前连接的区块链信息和账号信息

前面 我们讲了 MetaMask和ganache的配置安装 并用 MetaMask管理ganache的启动的虚拟区块链 那么 我们现在也完全可以写一个网页来做这个东西的管理 您可以先查看文章web3.js获取导入做一个导入了 web3的html文件 首先我们可以来试着 获取 自己当前是在哪个区块的 getBlockNum…

【深度学习】【分布式训练】DeepSpeed:AllReduce与ZeRO-DP

AllReduce与ZeRO-DP ​ ZeRO-DP是分布式训练工具DeepSpeed的核心功能之一,许多其他的分布式训练工具也会集成该方法。本文从AllReduce开始,随后介绍大模型训练时的主要瓶颈----显存的占用情况。在介绍完成标准数据并行(DP)后,结合前三部分的内…

玩游戏提示d3dx9丢失-找不到d3dx9怎么修复

相信有些朋友遇到了d3dx9丢失的情况不知道怎么解决,而今日小编带来的这篇文章就是讲解关于d3dx9丢失进行修复的操作内容,d3dx9丢失怎么解决?(修复方法)d3dx9文件是DirectX中必备文件,许多游戏需要此文件运行。 d3dx9丢…

文件系统概述

目录 概述用户空间层面1.应用程序可以直接使用内核提供的系统调用访问文件:2.应用程序也可以使用 glibc 库封装的标准 I/O 流函数访问文件: 硬件层面1.块设备2.闪存3.NVDIMM 内核空间层面 概述 在 Linux 系统中,一切皆文件,除了通…

【MySQL 】:测试数据准备、SQL语句规范与基本操作

前言 欢迎来到小K的MySQL专栏,本节将为大家准备MySQL测试数据、以及带来SQL语句规范、数据库的基本操作的详细讲解~✨文末送书,小K赠书活动第二期 目录 前言一、准备测试数据二、SQL语句规范三、数据库的基本操作四、总结:文末赠书 一、准备测…

直线导轨在焊接领域有什么作用?

焊接技术在现代制造业中的应用越来越广泛,直线导轨作为重要的传动元件,已经成为焊接设备中不可或缺的部分。 相对于直线轴承来说,直线导轨具有较高的负载能力和刚度,能够保证高精度的直线运动,滑动摩擦小,惯…

【Python】异常处理 ③ ( 捕获所有类型的异常 | 默认捕获所有类型异常 | 捕获 Exception 异常 )

文章目录 一、Python 默认捕获所有类型异常1、默认捕获所有类型异常 - 无法获取异常类型2、代码实例 - 默认捕获所有类型异常 二、Python 捕获所有类型异常 - 捕获 Exception 异常1、捕获 Exception 类型异常 - 可获取异常类型2、代码实例 - 捕获 Exception 异常 一、Python 默…

管理类联考——逻辑——知识篇——形式逻辑——三、直言——haimian

直言 考点分析 直言 年度 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023题量786223232 性质定义 直言命题也叫做性质命题,是判断事物是否具有某种性质的命题。直言命题由四部分组成:主项、谓项、联项、量项。 不同种类 对当关系 对…

PID控制算法:2、Derivative Kick(微分冲击)

什么是微分冲击Derivative Kick 引入微分,就是为了减少超调量的,但是根据PID的经典公式 就看微分部分 在PID刚开始时,误差值肯定是存在的,但是PID启动的瞬间,这个dt是很小的,这就导致是一个很大的值&#…

软件开发实习个人总结

软件开发实习个人总结篇1 一、实习目的 随着时代发展和社会进步,用人单位对游戏软件专业大学生的要求越来越高,对于即将毕业的游戏软件专业在校生而言,为了能更好的适应游戏软件专业严峻的就业形势,毕业后能够尽快的融入到社会&am…

Golang学习日志 ━━ 通过将gin-vue-admin项目上传到自己的仓库并且与原版保持更新来学习github操作

gin-vue-admin是一套国人用golang开发的后台管理系统,本文是从作者早期原文中截取的一部分,后期会以本文为框架进行扩展说明。 官网:https://www.gin-vue-admin.com/ 学习视频:https://www.bilibili.com/video/BV1kv4y1g7nT/?p6 …

Redis 2023面试5题(七)

一、Redis redlock 实现原理 Redlock是一种基于Redis的分布式锁实现,它可以解决在分布式系统中由于主从切换、网络延迟等导致的锁竞争问题。 Redlock的实现原理如下: 创建多个Redis实例,每个实例都有相同的锁名称。使用Redis的SETNX命令尝试…

如何选择消息中间件

一、 分布式系统消息通信技术简介 分布式系统消息通信技术主要包括以下几种: 1. RPC(Remote Procedure Call Protocol). 一般是C/S方式,同步的,跨语言跨平台,面向过程 2. CORBA(Common Object Request Broker Architecture). CO…

Vlan与ARP讲解

目录 Vlan讲解 Vlan标签 二层接口类型 ARP ARP的作用 ARP地址解析报文讲解 免费ARP报文讲解 ARP缓存表 Vlan讲解 Vlan(Virtual Local Area Network)虚拟局域网,将一个物理的LAN在逻辑上划分为多个广播域;可以理解为一个V…

RT-Thread-11-事件集

事件集 举例说明事件集: 1、A坐公交车去某地,只有一趟公交车去该地,等此公交车即可出发; 2、A坐公交车去某地,有三趟公交车去该地,等其中任意一辆公交车即可出发; 3、A约B一起去某地&#xff0…

点亮你的创意,使用Python与树莓派制作呼吸灯的详细教程

文章目录 前言PWM的介绍实现PWM控制LED亮度结果与分析 前言 在上一篇文章中,我们介绍了如何在树莓派上点亮一个LED灯,并让它以时间间隔为1秒进行闪烁。闪亮登场!在树莓派上点亮LED灯的简单详细方法_☞黑心萝卜三条杠☜的博客-CSDN博客。现在&…