Java 内部类(13/30)

news2024/11/26 12:28:02

目录

Java 内部类

1. 内部类的概念和类型

1.1 成员内部类

1.2 局部内部类

1.3 匿名内部类

1.4 静态内部类

2. 内部类的用途和优势

3. 内部类的注意事项

总结与后续


Java 内部类

内部类(Inner Class)是定义在另一个类内部的类。在 Java 中,内部类可以帮助开发者实现更紧凑和更清晰的代码结构,尤其是在需要对类进行逻辑分组或增强封装时。通过使用内部类,我们可以更好地控制类的可见性和访问权限。本模块将介绍 Java 内部类的概念、各种类型的内部类以及它们的使用场景。

1. 内部类的概念和类型

内部类是定义在另一个类的内部,可以访问包含它的外部类的成员。Java 中有四种主要的内部类:

  • 成员内部类(Member Inner Class)

  • 局部内部类(Local Inner Class)

  • 匿名内部类(Anonymous Inner Class)

  • 静态内部类(Static Nested Class)

1.1 成员内部类

成员内部类 是最常见的一种内部类,定义在外部类的内部,与外部类的实例关联。

示例:成员内部类

public class OuterClass {
    private String message = "Hello from OuterClass!";

    public class InnerClass {
        public void printMessage() {
            System.out.println(message);
        }
    }

    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        OuterClass.InnerClass inner = outer.new InnerClass();
        inner.printMessage();
    }
}

在这个例子中,InnerClassOuterClass 的成员内部类,内部类可以直接访问外部类的成员变量 message

1.2 局部内部类

局部内部类 是定义在方法或代码块内部的类,它的作用域仅限于定义它的方法或代码块。

示例:局部内部类

public class LocalInnerClassExample {
    public void display() {
        class LocalInner {
            void print() {
                System.out.println("这是局部内部类");
            }
        }
        LocalInner localInner = new LocalInner();
        localInner.print();
    }

    public static void main(String[] args) {
        LocalInnerClassExample example = new LocalInnerClassExample();
        example.display();
    }
}

在这个例子中,LocalInner 是一个局部内部类,它只在 display() 方法中可见。

1.3 匿名内部类

匿名内部类 没有名字,通常用于简化代码,特别是当需要实现接口或继承抽象类时。匿名内部类可以用来创建一次性使用的类。

示例:匿名内部类

public class AnonymousInnerClassExample {
    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("匿名内部类实现 Runnable 接口");
            }
        };
        new Thread(runnable).start();
    }
}

在这个例子中,我们使用匿名内部类实现了 Runnable 接口,并创建了一个线程执行它。

1.4 静态内部类

静态内部类 使用 static 关键字修饰,静态内部类与外部类的实例无关,因此它不能访问外部类的非静态成员。

示例:静态内部类

public class StaticNestedClassExample {
    static class StaticNested {
        void display() {
            System.out.println("这是静态内部类");
        }
    }

    public static void main(String[] args) {
        StaticNestedClassExample.StaticNested nested = new StaticNestedClassExample.StaticNested();
        nested.display();
    }
}

在这个例子中,StaticNested 是一个静态内部类,可以通过外部类直接访问,而不需要外部类的实例。

2. 内部类的用途和优势

  • 逻辑分组:内部类可以将逻辑上相关的类组合在一起,使代码更加组织有序。

  • 封装:内部类可以隐藏不必要的实现细节,仅对外暴露外部类的接口。

  • 访问外部类成员:内部类可以直接访问外部类的私有成员,这对于实现某些功能非常方便。

  • 实现事件处理:匿名内部类非常适合用于事件处理,例如在 GUI 应用程序中实现按钮点击事件。

3. 内部类的注意事项

  • 访问限制:成员内部类和局部内部类可以访问外部类的所有成员,包括私有成员。而静态内部类只能访问外部类的静态成员。

  • 创建实例:成员内部类的实例必须通过外部类的实例来创建,而静态内部类的实例可以直接通过外部类名创建。

  • 匿名内部类的限制:匿名内部类无法定义构造方法,只能通过实例初始化块来进行一些初始化操作。

示例:匿名内部类访问外部变量

public class Outer {
    public void method() {
        int number = 10;
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("外部变量 number: " + number);
            }
        };
        new Thread(runnable).start();
    }

    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.method();
    }
}

在这个例子中,匿名内部类可以访问外部方法中的变量 number,但是该变量必须是 隐式最终变量(即在内部类使用过程中不可改变)。

总结与后续

在本模块中,我们学习了 Java 的内部类,包括成员内部类、局部内部类、匿名内部类和静态内部类。内部类有助于代码组织和封装,并在特定场景下提高代码的可读性和灵活性。

在下一模块中,我们将讨论 Java 的注解(Annotations),了解注解的定义、内置注解的使用,以及如何自定义注解,以便更好地为代码添加元数据和实现编译时的检查。

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

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

相关文章

c++编解码封装

多态版编解码 对服务器和客户端的结构体进行序列化然后对数据进行反序列化 案例分析 代码demo Codec.h #pragma once #include <iostream>class Codec { public:Codec();virtual std::string encodeMsg();//string是标准库的string类virtual void* decodeMsg();virtu…

WPF拖拽交互全攻略及实现自定义拖拽控件及数据交换技巧解析

目录 1. 基本概念2 . 实现拖拽功能概述需要要实现基本的拖放&#xff0c;完成以下任务&#xff1a;其他操作 示例3.1 设置拖拽源&#xff0c;拖拽开始3.2 设置拖拽效果DragDropEffects 3.3 设置放置目标&#xff0c;处理拖拽数据拖拽输入DragEnter事件DragOver事件拖拽离开Drag…

【jvm】为什么Xms和Xmx的值通常设置为相同的?

目录 1. 说明2. 避免性能开销3. 提升稳定性4. 简化配置5. 优化垃圾收集6. 获取参数6.1 代码示例6.2 结果示例 1. 说明 1.-Xms 和 -Xmx 参数分别用于设置堆内存的初始大小&#xff08;最小值&#xff09;和最大大小。2.在开发环境中&#xff0c;开发人员可能希望快速启动应用程…

c++提示函数可能不安全This function or variable may be unsafe

现象 编译c代码时&#xff0c;经常会出现如下提示&#xff0c;大约有几种情况&#xff1a; 现象一 warning C4996: strcpy: This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online …

苹果ANE引擎以及使用编程方法介绍

苹果ANE引擎介绍 大多数新款iPhone和iPad都配备了一个神经网络引擎&#xff08;Neural Engine&#xff09;&#xff0c;这是一种特殊的处理器&#xff0c;能让机器学习模型的运行速度变得非常快。然而&#xff0c;关于这个处理器具体如何工作&#xff0c;公众所知的信息并不多…

Python | Leetcode Python题解之第516题最长回文子序列

题目&#xff1a; 题解&#xff1a; class Solution:def longestPalindromeSubseq(self, s: str) -> int:n len(s)dp [[0] * n for _ in range(n)]for i in range(n - 1, -1, -1):dp[i][i] 1for j in range(i 1, n):if s[i] s[j]:dp[i][j] dp[i 1][j - 1] 2else:dp…

网络编程 UDP编程 Linux环境 C语言实现

UDP编程 1. 一般UDP编程 UDP传输特点&#xff1a;非面向连接、不可靠的、无序的 报式传输 支持组播和广播 UDP应用数据最大长度建议&#xff1a;MTU(以太网分组数据的最大长度)1500 - 20(IP头) - 8(UDP头) 1472Bytes 客户端&#xff1a;支持两种形式的代码编写: 1. 不定向…

高压线路覆冰厚度测量,输电线路微波覆冰监测装置守护电网安全

随着北方地区正式步入冬季&#xff0c;气温急剧下降&#xff0c;高压线路覆冰现象日益严重&#xff0c;给电网安全带来了前所未有的挑战。近日&#xff0c;在东北某省&#xff0c;由于连续低温天气&#xff0c;多条高压线路遭受了严重的覆冰侵袭&#xff0c;这不仅极大地加重了…

Java面试经典 150 题.P88. 合并两个有序数组(001)

本题来自&#xff1a;力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解 class Solution {public void merge(int[] nums1, int m, int[] nums2, …

基于安卓Android的健身系统APP(源码+文档+部署+讲解)

&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 选题不知道怎么选 不清楚自己适合做哪块内容 都可以免费来问我 会持续一直更新下去 有问必答 一键收藏关注不迷路 源码获取&#xff1a;https://pan.baidu.…

中电信翼康工程师:我在 Apache SeaTunnel 社区的贡献之旅

贡献者Github ID&#xff1a;luckyLJY 文章整理&#xff1a;曾辉 Apache SeaTunnel 作为一款强大的数据同步和转换工具&#xff0c;凭借其部署易用性、容错机制、数据源支持、性能优势、功能丰富性以及活跃的社区支持&#xff0c;成为了数据工程师们不可或缺的利器。 因其具有的…

offset Explorer连接云服务上的kafka连接不上

以上配置后报连接错误时&#xff0c;可能是因为kafka的server.properties配置文件没配置好&#xff1a; 加上面两条配置&#xff0c;再次测试连接&#xff0c;成功 listeners和advertised.listeners

使用Python来下一场雪

具体效果&#xff1a;&#xff08;大雪缓缓下落&#xff09; 完整代码&#xff1a; import pygame import random# 初始化 Pygame pygame.init()# 设置窗口 width, height 800, 600 screen pygame.display.set_mode((width, height)) pygame.display.set_caption("下雪…

k8s 1.28.2 集群部署 Thanos 对接 MinIO 实现 Prometheus 数据长期存储

文章目录 [toc]什么是 ThanosThanos 的主要功能Thanos 的架构组件Thanos 部署架构SidecarReceive架构选择 开始部署部署架构创建 namespacenode-exporter 部署kube-state-metrics 部署Prometheus Thanos-Sidecar 部署固定节点创建 label生成 secretMinIO 配置etcd 证书 启动 P…

13、基于AT89C52轮询方式扫描按键proteus仿真

一、仿真原理图: 二、仿真效果: 三、相关代码: 1、main主函数: void main(void) { unsigned char ll; VariableInit(); while(1) { value = keyScan(); display(); …

春季测试 2023 我的题解

T1 涂色游戏 这道题目还是比较简单的 容易发现&#xff0c;位于 ( x i , y i ) (x_i,y_i) (xi​,yi​) 的格子的颜色只取决于 ​ x i x_i xi​ 行与 y i y_i yi​ 列的颜色。 这时候可以想到开两个数组&#xff0c;分别存储列与行的绘画信息&#xff0c;然后发现前后的互相…

magic-api简单使用二:自定义返回结果

背景 在上一章 中我们学习了搭建项目和导入文件&#xff0c; 这二天稍微有点时间&#xff0c;研究下这个magic-api的写法。 后续如果需要维护或者更改&#xff0c;也能在项目中尽快上手。 今天我们主要学习自定义返回结果&#xff0c;当然也可以使用官方的。不需要任何更改。…

“启动智能制造引擎 推动新质生产力发展”高峰论坛在京成功举办

在智能制造技术的助力下,北京经开区的智能制造产业稳步发展。2024年10月25日,北京电子科技职业学院图书馆暨北京经济技术开发区公共图书馆举办一场以“启动智能制造引擎 推动新质生产力发展”为主题的高峰论坛于北京亦庄经开区盛元书院圆满落幕。此次论坛为北京经开区智能制造产…

Java 异常处理(6/30)

目录 Java 异常处理 1. 什么是异常 2. 异常处理的关键字 2.1 try-catch 语句 2.2 多个 catch 块 2.3 finally 块 2.4 throw 和 throws 3. 自定义异常 4. 异常处理的最佳实践 总结与后续 Java 异常处理 在软件开发中&#xff0c;异常处理&#xff08;Exception Handl…

ubuntu22.04安装向日葵

1、下载deb安装包 进入官网下载图形版本&#xff1a;https://sunlogin.oray.com/download/linux?typepersonal 2、命令行安装 sudo chmod x 文件名.deb sudo dpkg -i 文件名.deb 3、开始报错的看这里&#xff01; 首先展示一下安装成功的效果图&#xff1a; 接下来是我安…