大白话拆解!!!! 人们口中常说的 类(顶级类)和 内部类 (成员内部类,局部内部类,匿名内部类,静态内部类)

前言:小编之前都不怎么会用这个软件发文章,现在也是终于会使用目录这个功能了(有点老粘人,诶呀,之前也是苦了各位了,文章布局观赏性太差了)。

                                就是这样,多练习,多犯错,多进步!!!

一,概述

1.1什么是内部类?

官方定义:将一个类A定义在另一个类B里面,里面的那个类A就称为内部类 (InnerClass),类B则称为外部类(OuterClass)。

内部类的存在主要是为了更好地模拟现实世界中的关系,并且有助于创建更加模块化、可维护的代码。(还是模棱两可!!!

内部类到底是什么东西?

如何理解?举个栗子!!!

在现实生活中,引擎是汽车的一部分,通常不会独立于汽车存在。因此,在代码设计上,你可以将Engine作为Car的一个内部类,这样就很好地模拟了这种包含关系。也就是说,每个Car实例都可以有自己的Engine实例,并且Engine的行为和属性可以与特定的Car实例相关联。

是不是有点概念了,嘻嘻先别急,我们接着往下看!!!

1.2内部类和人们口中常说的类有何区别?

1.1.1 官方术语解释(呜呜呜)

内部类(Inner Class)与人们口中常说的类又叫普通类(Top-Level Class,也称为顶级类)的

主要区别在于它们的  定义位置、访问权限  和  生命周期。

1. 定义位置


人们口中常说的类:

顶级类是直接在包级别定义的类,它不是任何其他类或方法的成员。

每个顶级类通常保存在一个单独的源文件中,并且该文件名必须与顶级类的名字相同。


内部类:内部类是定义在另一个类(外部类)内部的类。

①它可以作为成员内部类、局部内部类、匿名内部类或静态内部类(也称为嵌套类)。

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


2. 访问权限


顶级类:顶级类可以是public或默认(包私有)。如果一个顶级类被声明为public,那么它的源文件名必须与类名相同,并且一个源文件中只能有一个public顶级类。


内部类:内部类可以使用所有的访问修饰符:private、protected、默认(包私有)以及public。此外,内部类还可以使用static修饰符来表示它是一个静态内部类,这将改变其行为方式。


3. 生命周期


顶级类:顶级类的对象的生命周期独立于其他对象。一旦创建,顶级类的对象就存在于内存中,直到没有引用指向它,或者程序结束。


成员内部类:成员内部类的对象总是隐式地关联到一个外部类的实例。这意味着你不能在没有外部类实例的情况下创建成员内部类的实例。成员内部类的生命周期依赖于创建它的外部类实例。


静态内部类:静态内部类不依赖于外部类的实例,因此可以在没有外部类实例的情况下创建静态内部类的实例。它的生命周期与顶级类相似。


局部内部类:局部内部类是在方法或代码块中定义的类,它的作用域仅限于定义它的代码块。局部内部类不能使用访问修饰符(如public、private等),并且只能在定义它的方法或代码块中创建实例。


匿名内部类:匿名内部类是没有名字的内部类,它是在创建对象的同时定义的。匿名内部类的实例只能创建一次,通常用于实现接口或继承类并立即创建其实例。


4. 内存开销


成员内部类:由于成员内部类的每个实例都持有一个指向其外部类实例的隐式引用,因此相比于静态内部类,成员内部类可能会导致更多的内存开销。


静态内部类:静态内部类不会持有对外部类实例的引用,所以它的内存开销相对较小。


5. 使用场景


顶级类:当需要定义一个完全独立的实体,该实体可能被多个其他类使用时,应该使用顶级类。


内部类:当需要定义一个类,而这个类只在另一个类的上下文中才有意义,或者是为了增强封装性、简化代码结构时,应该考虑使用内部类。

1.1.2 我的人话比喻(嘻嘻嘻)

普通类:
有一个独立的建筑物,比如一栋办公楼。这栋楼有自己的地址、楼层、入口等特性。它是一个独立的存在,不需要依赖于其他建筑物就可以完整地工作。办公楼可以有员工进出,有会议室使用,有电梯运行等等,这些都是办公楼自身的行为和属性。

在编程中,顶级类就像这栋办公楼一样,它是独立存在的,可以在程序的任何地方被实例化和使用。顶级类有自己的构造函数、方法和字段,它可以和其他类交互,但不需要依赖于其他类才能存在或工作。每个顶级类通常定义在一个单独的文件中,并且它的作用范围是全局的,也就是说,只要导入了这个类,就可以在程序的任何地方使用它。

内部类:


看一下办公楼内部的一个房间,比如经理办公室。经理办公室是办公楼的一部分,它不能脱离办公楼而存在。经理办公室有自己的特点,比如特定的装饰、特殊的设备等,但它总是属于某一层楼的一部分,而且只能通过进入办公楼才能到达经理办公室。经理办公室的活动也往往与办公楼的活动密切相关,例如,当办公楼关门时,经理办公室也会关闭。

在编程中,内部类就像经理办公室一样,它是另一个类(外部类)的一部分,不能独立于外部类存在。内部类可以直接访问外部类的所有成员(包括私有成员),并且它的创建通常需要一个外部类的实例。内部类的生命周期与外部类紧密相关,它的作用范围也被限制在外部分类的内部。内部类可以帮助我们将相关的功能逻辑组织在一起,使代码更加模块化和易于维护。

区别在哪里呢?


存在形式:顶级类是独立的,可以在没有其他类的情况下实例化;内部类必须嵌套在另一个类的内部,通常需要外部类的实例来创建。


访问权限:顶级类的成员可以通过公共接口被任何其他类访问;内部类不仅可以访问自己的成员,还可以访问外部类的所有成员,包括私有成员。


命名空间:顶级类有自己的命名空间,名称在全球范围内唯一;内部类存在于外部类的命名空间内,其名称可以在外部类的作用域中重复使用。


用途:顶级类用于定义独立的对象和行为;内部类用于定义那些紧密关联于外部类对象的行为,或者仅在外部类上下文中使用的辅助类。

1.3为什么要有内部类,这个概念存在是解决哪些实际应用中的问题或是不便的?

内部类存在的  主要目的  和带来的  改进

逻辑分组:内部类有助于将相关的代码逻辑组织在一起。如果一个类仅在另一个类的上下文中使用,那么将其作为内部类是有意义的。这使得代码更加模块化,也更容易理解和维护。


访问控制:内部类可以访问其外部类的所有成员,包括私有成员。这意味着内部类可以很容易地操作外部类的数据,而不必通过公共接口暴露这些数据。这对于实现某些设计模式(如迭代器模式、组合模式等)非常有用。


提高封装性:由于内部类通常是私有的或受保护的,它们对外部世界隐藏了实现细节。这提高了代码的安全性和封装性,因为外部代码无法直接访问内部类,除非通过外部类提供的方法。


简化代码:有时候使用内部类可以减少创建额外的顶级类的需要,从而简化代码结构。特别是当你只需要一个临时的或者辅助的类时,内部类可以是一个很好的选择。


适配器模式的实现:在某些情况下,内部类被用来实现适配器模式,即创建一个类来“适配”一个现有类的功能,使其能够符合另一个接口的要求。这是Java事件处理机制中常用的技术,例如为按钮添加点击监听器。


实现多重继承的效果:虽然Java不支持一个类从多个类继承,但通过内部类,可以在一定程度上实现类似多重继承的行为,即一个内部类可以继承自一个类同时实现多个接口。

1.4内部类的分类和组成

其他内部类,我们下次细说。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值