Java编程思想学习录(连载之:内部类)

Java编程思想学习录连载文章

用thinkpad打字确实很爽啊!


内部类基本概念

  • 可将一个类的定义置于另一个类定义的内部
  • 内部类允许将逻辑相关的类组织在一起,并控制位于内部的类的可见性
  • 甚至可将内部类定义于一个方法或者任意作用域内!
  • 当然,内部类 ≠ 组合
  • 内部类拥有其外围类 所有元素的 访问权
  • 更有甚,嵌套多层的内部类能透明地访问所有它所嵌入的外围类的所有成员

一个典型的例子:利用 Java内部类 实现的 迭代器模式


.this 与 .new 的使用场景

.this用于在内部类中生成对其外部类对象的引用之时,举例:

.new用于直接创建内部类的对象之时,距离:


嵌套类(static类型的内部类)

嵌套类是无需依赖其外部类的对象的。非static内部类通过一个特殊的this链接到其外围类的对象,而static类型的内部类无此this引用。

接口与内部类有着很有趣的关系: 放到接口中的任何类自动都是public且static,即接口中的任何类都是嵌套类,我们甚至可以在接口的内部类中去实现其外围接口,举例:


方法 作用域 内的内部类

可以称这类为 局部内部类

方法中定义的内部类只能在方法内被使用,方法之外不可访问,举例:

更进一步,可在任意作用域内定义内部类,举例:


匿名内部类

直观上看,这种内部类没有“名字”,举例:

若想将外部的参数传到匿名内部类中(典型的如将外部参数用于对匿名内部类中的定义字段进行初始化时)使用的话,该参数必须final,举例:

匿名内部类中不可能有命名的显式构造器,此时只能使用实例初始化的方式来模仿,举例(当然下面这个例子还反映了匿名内部类如何参与继承):

匿名内部类 + 工厂模式 = 更加简洁易懂:


总结:为什么需要内部类

内部类可以独立地继承自一个接口或者类而无需关注其外围类的实现,这使得扩展类或者接口更加灵活,控制的粒度也可以更细!

注意Java中还有一个细节:虽然Java中一个接口可以继承多个接口,但是一个类是不能继承多个类的!要想完成该特性,此时除了使用内部类来“扩充多重继承机制”,你可能别无选择,举例:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户2442861的专栏

java MS之泛型

http://blog.csdn.net/stypace/article/details/42102567

11420
来自专栏CoXie带你学编程

详解Python 2.x 与 Python 3.x 的区别

如果你是刚接触 Python 的初学者,那你可能是直接学习 Python 3.x 版本。对于 Python 2.x 的版本是不会有所接触。官方也宣布在 2020...

25020
来自专栏小蠢驴iOS专题

python入门_常见正则表达式匹配

24480
来自专栏LIN_ZONE

PHP 类型判断和NULL,空值检查

 PHP是一种宽松类型的编程语言,在函数中对传入的参数值的“类型”以及”值是否为空或者NULL“进行检查是不可缺少的步骤。

23420
来自专栏Vamei实验室

Python进阶04 函数的参数对应

我们已经接触过函数(function)的参数(arguments)传递。当时我们根据位置,传递对应的参数。我们将接触更多的参数传递方式。 回忆一下位置传递: d...

20670
来自专栏架构师之旅

JavaScript 知识点梳理 | 从基础语法到高级用法

JavaScript是按照ECMAScript标准设计和实现的,后文说的JavaScript语法其实是ES5的标准的实现。 先说说有哪些基础语法? 01- 最...

27850
来自专栏LuckQI

学习Java基础知识,打通面试关~十二接口与抽象类

11740
来自专栏我的技术专栏

C++ 异常机制分析

19540
来自专栏C/C++基础

C/C++数据类型的转换之终极无惑

数据类型在编程中经常遇到,虽然可能存在风险,但我们却乐此不疲的进行数据类型的转换。

10630
来自专栏猿人谷

C++ 模板学习

1. 模板的概念。 我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为...

263100

扫码关注云+社区

领取腾讯云代金券