java面向对象.day29(内部类)

内部类说明:

  1. 内部类就是在一个类的内部在定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就是外部类了。

  2. Java内部类是一种非常强大的特性,它允许你在一个类的内部定义另一个类。内部类可以访问外部类的所有成员,包括私有成员,这提供了一种更紧密的代码组织方式,并且可以在一定程度上增强封装性。

分类:

  1. 实例内部类:实例内部类是最普通的内部类,它没有static修饰符。实例内部类可以访问外部类的所有成员,包括私有成员。要创建实例内部类的对象,必须先创建外部类的对象。

  2. 静态内部类:静态内部类是在外部类中定义为static的类。由于它是静态的,它不能访问外部类的非静态成员(实例变量和实例方法)。静态内部类可以像普通类一样被实例化,并且它的实例化对象可以访问外部类的静态成员。

  3. 局部内部类:局部内部类是在外部类的方法内部定义的类。它的作用域限制在定义它的方法内,并且它可以访问该方法内的局部变量(这些变量必须被声明为final)。局部内部类通常用于解决一些较小范围的问题。

  4. 匿名内部类:匿名内部类是没有名字的内部类,它通常用于实现一个接口或继承一个类,并且只使用一次。匿名内部类常常用于简化代码,特别是在实现接口或重写方法时。

内部类的特点和用途:

  1. 代码组织:内部类可以将一些逻辑上紧密相关的类组织在一起,提高代码的可读性和可维护性。

  2. 数据隐藏:内部类可以访问外部类的私有成员,这种特性可以在一定程度上实现数据隐藏和封装。

  3. 事件监听器:在GUI编程中,内部类常用于实现事件监听器,如按钮点击事件、鼠标移动事件等。

  4. 回调:内部类可以作为回调函数使用,特别是在需要多次调用同一回调函数的情况下。

  5. 单例模式:内部类也常用于实现单例模式,通过将构造方法设置为private,并在外部类中提供一个静态方法来获取内部类的实例。

内部类的创建和使用:

创建内部类对象的一般步骤如下:

  1. 创建外部类对象(对于实例内部类和局部内部类)。

  2. 使用外部类对象(对于实例内部类)或外部类类名(对于静态内部类)来创建内部类对象。

// 创建外部类对象
Outer outer = new Outer();
​
// 创建实例内部类对象
Outer.Inner inner = outer.new Inner();
​
// 创建静态内部类对象
Outer.StaticInner staticInner = new Outer.StaticInner();

对于匿名内部类,你可以直接实例化它,而不需要显式地定义类名:

Runnable runnable = new Runnable() {
    @Override
    public void run() {
        System.out.println("Running the anonymous inner class");
    }
};
runnable.run();

注意事项:

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

  • 静态内部类不能访问外部类的非静态成员。

  • 局部内部类可以访问包含它的方法的final局部变量。

  • 内部类持有外部类的隐式引用,这可能会导致内存泄漏,特别是在创建大量的内部类对象时。

内部类是Java语言中一个强大的特性,通过合理使用内部类,你可以编写更加简洁、可维护和可扩展的代码。然而,过度使用内部类可能会使代码结构变得复杂,因此在使用时需要权衡利弊。

代码示例:

实例内部类

public class Outer {
    private String outerVar = "I am in Outer";
​
    // 实例内部类
    public class Inner {
        public void showOuterVar() {
            System.out.println(outerVar); // 可以访问外部类的实例变量
        }
    }
​
    public static void main(String[] args) {
        Outer outer = new Outer(); // 必须先创建外部类的实例
        Outer.Inner inner = outer.new Inner(); // 然后使用外部类实例创建内部类实例
        inner.showOuterVar(); // 输出: I am in Outer
    }
}
​

在这个示例中,Inner 是一个实例内部类。它可以访问外部类 Outer 的所有成员,包括私有成员。要创建 Inner 的实例,必须先创建外部类 Outer 的实例,并使用该实例来创建内部类实例。

静态内部类

public class Outer {
    private static String outerStaticVar = "I am static in Outer";
    private String outerVar = "I am in Outer";
​
    // 静态内部类
    public static class StaticInner {
        public void showStaticVar() {
            System.out.println(outerStaticVar); // 可以访问外部类的静态变量
            // System.out.println(outerVar); // 不能访问外部类的非静态变量
        }
    }
​
    public static void main(String[] args) {
        StaticInner staticInner = new StaticInner();
        staticInner.showStaticVar(); // 输出: I am static in Outer
    }
}
​

在这个示例中,StaticInner 是一个静态内部类。它可以访问外部类 Outer 的静态变量 outerStaticVar,但不能访问非静态变量 outerVar。要创建 StaticInner 的实例,我们不需要外部类 Outer 的实例。

局部内部类

public class Outer {
    public void show() {
        int localVariable = 100;
​
        // 局部内部类
        class LocalInner {
            public void printLocalVariable() {
                System.out.println(localVariable); // 可以访问包含它的方法的局部变量(必须是final的)
            }
        }
​
        LocalInner localInner = new LocalInner();
        localInner.printLocalVariable(); // 输出: 100
    }
​
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.show();
    }
}
​

在这个示例中,LocalInner 是一个局部内部类,定义在 show 方法内部。它可以访问包含它的方法 show 的局部变量 localVariable,但是这个局部变量必须被声明为 final。局部内部类的作用域仅限于包含它的方法内部。

匿名内部类

public class Outer {
    public interface Showable {
        void show();
    }
​
    public void executeShowable(Showable showable) {
        showable.show();
    }
​
    public static void main(String[] args) {
        Outer outer = new Outer();
​
        // 使用匿名内部类实现接口并传递给方法
        outer.executeShowable(new Showable() {
            @Override
            public void show() {
                System.out.println("I am an anonymous inner class implementing Showable");
            }
        });
    }
}
​

在这个示例中,我们创建了一个匿名内部类来实现 Showable 接口,并将其作为参数传递给 executeShowable 方法。匿名内部类在需要一次性使用的情况下非常有用,比如实现一个接口或重写某个方法。

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

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

相关文章

Kimi 高效使用技巧,80%的人都不知道

关注我, AI 学习之旅上,我与您一同成长! 一、引言 Kimi 作为国产之光,在过去的一个多月里成为国内大模型的香饽饽。据数据分析,Kimi 网页、APP、小程序等各端的日活已经突破 300 万,超过文心一言、通义千问、智谱清言…

单链表实现通讯录

不过多赘述了 顺序表的增删查改-CSDN博客https://blog.csdn.net/bkmoo/article/details/137566495?spm1001.2014.3001.5502 使用顺序表实现通讯录-CSDN博客https://blog.csdn.net/bkmoo/article/details/137676561?spm1001.2014.3001.5502这里没有使用文件操作只是简单的使…

6.MMD ray渲染 材质的添加及打光方法

材质 前置准备 先准备好模型和场景 将ray控制器拖入进去 添加完默认的材质以后的效果 打开插入材质页面 打开MaterialMap栏 将流萤的模型展开 自发光 现在给领带添加一个自发光效果 在自发光Emissive里,打开x1,选择albedo,白光 现在…

使用微软Phi-3-mini模型快速创建生成式AI应用

微软Phi-3大语言模型是微软研究院推出的新一代系列先进的小语言模型。Phi-3系列包括phi-3-mini、phi-3-small和phi-3-medium三个不同规模的版本。这些模型在保持较小的参数规模的同时,通过精心设计的训练数据集和优化的算法,实现了与大型模型相媲美的语言…

【CVPR2023】Re:InterHand:一个用于3D交互手部姿态估计的重光照数据集

这篇论文的标题是《A Dataset of Relighted 3D Interacting Hands》,作者是Gyeongsik Moon, Shunsuke Saito, Weipeng Xu, Rohan Joshi, Julia Buffalini, Harley Bellan, Nicholas Rosen, Jesse Richardson, Mallorie Mize, Philippe de Bree, Tomas Simon, Bo Pen…

玩转PyCharm

玩转PyCharm PyCharm是由JetBrains公司开发的提供给Python专业的开发者的一个集成开发环境,它最大的优点是能够大大提升Python开发者的工作效率,为开发者集成了很多用起来非常顺手的功能,包括代码调试、高亮语法、代码跳转、智能提示、自动补…

MyBatis 核心配置讲解(上)

大家好,我是王有志,一个分享硬核 Java 技术的互金摸鱼侠。 前两篇的文章中我们分别介绍了 MyBatis 和 MyBaits 的应用组成,到这里基础篇的内容就结束了。 从今天开始,我们正式进入 MyBatis 学习的第二阶段:MyBatis 的…

【QT学习】9.绘图,三种贴图,贴图的转换,不规则贴图(透明泡泡),简单绘图工具制作

一。绘图的解释 Qt 中提供了强大的 2D 绘图系统,可以使用相同的 API 在屏幕和绘图设备上进行绘制,它主要基于QPainter、QPaintDevice 和 QPaintEngine 这三个类。 QPainter 用于执行绘图操作,其提供的 API 在 GUI 或 QImage、QOpenGLPaintDev…

maya blendshape

目录 shape编辑器 maya创建blendshape python 脚本 添加形变动画 查看顶点个数 shape编辑器 打开方式: 窗口-动画编辑器-形变编辑器 maya创建blendshape python 脚本 import maya.cmds as cmds# 创建基础网格 - 球体 baseMesh cmds.polySphere(name"bas…

Postman 工具发送请求的技巧与实践

在开发和测试 API 时,发送 JSON 格式的请求是一个常见需求。 在 Postman 中构建和发送 JSON 请求 创建一个新的请求 首先,在 Postman 启动界面上找到并点击 “New” 按钮,选择 “HTTP Request” 来开始新建一个请求。这一步骤允许你定义请…

Unity射击游戏开发教程:(7)Powerup的使用

确定 PowerUp 效果应持续多长时间 我在游戏中放置的第一个道具是三重射击。当玩家收集三重射击能量时,他们可以一次发射 3 束激光,而正常情况下只能发射 1 束激光。在实施道具时,您需要考虑它们的功能以及它将如何影响游戏玩法。至于三连射&

Linux-缓冲区(简单理解)

1. 缓冲区是什么 缓冲区就是一段内存空间。 2. 为什么要有缓冲区 IO写入有两种: 写透模式(WT) 成本高,效率低写回模式(WB) 成本低,效率高 写透模式:每次的文件写入都要立即刷新…

海外仓WMS管理系统:标准化海外仓管理模式,效率和管理模式双提升

就目前的跨境电商发展速度和体量来看,标准化海外仓管理的模式不再是一个选项,而是必走之路。 今天会重点和大家聊一下,海外仓企业应该如何利用好WMS管理系统,快速的标准化仓库管理的模式,以及大家比较关心的&#xff0…

JAVA读取文件完成词频统计

词频统计原数据和结果数据地址:https://download.csdn.net/download/LiHaoHang6/88845654?spm1001.2014.3001.5501 运行效果展示: 原数据展示: 词频统计思路: 1:先通过BufferedReader来读取本地文本文件,之后将文本…

excel 按照姓名日期年月分组求和

excel 需要按照 姓名 日期的年份进行金额求和统计,采用sumifs 进行统计 注意:sumifs 不支持 合并列拆分计算,合并列只会计算一个值 表格数据大概如下:(sheet) ABC姓名日期金额A2023/01/01500A2023/01/151500B2023/01/01200B202…

基于SpringBoot开发的同城租房系统租房软件APP小程序源码

项目背景 一、市场前景 随着城市化进程的加快和人口流动性的增强,租房市场正逐渐成为一个不可忽视的巨大市场。传统的租房方式往往存在着信息不对称、效率低下等问题,而同城租房软件的出现,则有效地解决了这些问题,为租房市场注…

云计算时代,企业面临的云安全风险

如今,随着云计算等新兴科技的发展,不同类型企业间的关联越来越多,它们之间的业务边界已被打破,企业上云成为了大势所趋。云计算应用帮助企业改变了IT资源不集中的状况,同时,数据中心内存储的大量数据信息&a…

Mediator 中介者

意图 使用一个中介者对象来封装一系列的对象交互。中介者使各个对象不需要显式地互相引用,从而使其耦合松散,而且可以独立的改变他们之间的交互。 结构 Mediator(中介者)定义一个接口用于各同事(Colleague&#xff0…

数值积分——复化梯形求积公式 | 北太天元

复化求积法的思想: 将区间 [ a , b ] [a,b] [a,b]进行 n n n等分,步长 h b − a n h\frac{b-a}{n} hnb−a​,等分点 x k a k h , k 0 , 1 , 2 , ⋯ , n x_{k}akh,k0,1,2,\cdots,n xk​akh,k0,1,2,⋯,n, 先在每个子区间 [ x k , x k 1 ] …

普惠金融淘金热:抢占‘高成长‘企业,抓住下一个十年的财富机遇!

官.网地址:合合TextIn - 合合信息旗下OCR云服务产品 2013年,十八届三中全会正式提出“发展普惠金融”,普惠金融自此上升为国家战略;十年来,我国普惠金融取得了长足发展,逐步构建了多层次、广覆盖的中国特…
最新文章