Java--深入理解内部类

为什么使用内部类:

内部类最吸引人的原因是:每个内部类都可以独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了一个(接口的)实现,对内部类都没有影响。

如果没有内部类提供的、可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角度看,内部类使得多重继承的解决方案变得更加完整。接口解决了部分问题,而内部类有效地实现了”多重继承“。也就是说,内部类允许继承多个非接口类型(类或抽象类)。

使用内部类的一些特性:

  • 内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外围类对象的信息相互独立;
  • 在单个外部类中,可以让多个内部类以不同的方式实现同一个接口,或继承同一个类;
  • 创建内部类对昂的时刻并不依赖于外围类对象的创建;
  • 内部类并没有让人迷惑的“is-a”关系,它就是一个独立的实体。

闭包和回调:

闭包(closure):是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。

通过这个定义,可以看出内部类是面向对象的闭包,因为它不仅包含外围类对象的信息,还自动拥有一个指向此外围类对象的引用,内部类有权操作所有成员,包括private成员。

回调(callback):使用者自己定义一个函数,实现这个函数的程序内容,然后把这个函数(入口地址)作为参数传入别人(或系统)的函数中,由别人(或系统)的函数在运行时来调用的函数。

Java最引人争议的问题就是,人们希望Java应该包含某种类似指针的机制,以允许回调。通过回调,对象能够携带一些信息,这些信息允许它在稍后的的某个时刻调用初始的对象。这是个非常有用的概念,但Java不支持指针。不过可以通过内部类提供的闭包功能来实现,他比指针更灵活,更安全。

内部类覆盖问题:

如果创建了一个内部类,然后继承其外部类并重新定义内部类时,内部类会被覆盖吗?答案是不会,就像是外部类的一个方法一样。这两个内部类完全是完全独立的两个实体,各自在各自的命名空间内。当然,明确地继承某个内部类是可以的。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程

给初学者:JavaScript 中数组操作注意点

作者:CarterLi https://segmentfault.com/a/1190000012463583 不要用 for_in 遍历数组 这是 JavaS...

1876
来自专栏用户2442861的专栏

python编码问题

我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。

1611
来自专栏菜鸟致敬

一分钟带你读懂Python中的三类特殊方法

在Python中有着三类特殊方法:静态方法、类方法以及抽象方法。今天我们来谈谈其中的这三类特殊方法。

712
来自专栏机器学习算法与Python学习

python基础-字符串与编码

转载于:廖雪峰的官方网站-python教程 字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。 因为计算机只能处理数字...

48011
来自专栏个人随笔

深入理解Java异常处理机制 (笼统篇)

841
来自专栏chafezhou

小说python中的迭代器(Iterator)

942
来自专栏http://www.cnblogs.com

内置函数filter()和匿名函数lambda解析

一.内置函数filter filter()函数是 Python 内置的一个高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是...

32912
来自专栏漏斗社区

听说,这个是CTF中最重要的问题······

0x00 序列化和反序列化 简单的理解:序列化就是使用serialize()将对象的用字符串的方式进行表示,反序列化是使用unserialize()将序列化的字...

3875
来自专栏HTML5学堂

switch语句以及与if的比较

HTML5学堂:JS的三大语句类型当中,有一种分支/选择性语句——switch。我们常说switch可以适当的和if配合使用,那么switch语句到底怎么书写,...

3797
来自专栏小白的技术客栈

Python函数基础

函数基础 简单地说,一个函数就是一组Python语句的组合,它们可以在程序中运行一次或多次运行。Python中的函数在其他语言中也叫做过程或子例程,那么这些被包...

3665

扫码关注云+社区

领取腾讯云代金券