博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java之内部类(1) - 为什么需要内部类
阅读量:6158 次
发布时间:2019-06-21

本文共 1638 字,大约阅读时间需要 5 分钟。

为什么需要内部类

      一般来说,内部类继承自某个类或实现某个接口,内部类的代码操作创建它的外围类的对象。所以可以认为内部类提供了某种进入其外围类的窗口。

      内部类必须要回答的一个问题是:如果只是需要一个对接口的引用,为什么不通过外围类实现那个接口呢?答案是:“如果这样能满足需求,那么就应该这样做。” 那么内部类实现一个接口与外围类实现这个接口有什么区别呢?

答案是:后者不是在那个能享用到接口带来的方便,有时需要用到接口的实现。所以,使用内部类最吸引人的原因是:

      每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类没有影响。

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

内部类允许继承多个非接口类型(类或抽象类)。

情景1:必须在一个类中以某种方式实现两个接口。由于接口的灵活性,可以有2种方式实现:使用单一类,或者使用内部类

1 package tools; 2  3 import tools.InnerClass.A; 4 import tools.InnerClass.B; 5  6 public class InnerClass { 7      8     interface A {} 9     interface B {}10     11     static void takesA(A a){}12     static void takesB(B b){}13 14     public static void main(String[] args) {15         16         X x = new X();17         Y y = new Y();18          //119         takesA(x);20         takesA(y);21         //222         takesB(x);23         takesB(y.makeB());24     }25 26 }27 28 class X implements A, B {}29 class Y implements A {30     B makeB() {31         return new B(){};32     }33 }
View Code

情景2:如果拥有的是抽象类或具体类,而不是接口,那就只能使用内部类才能实现多重继承了。

1 package tools; 2  3 class D {} 4 abstract class E {} 5 class Z extends D { 6     E makeE(){
return new E(){};} 7 } 8 9 10 public class InnerClass {11 static void takesD(D d){}12 static void takesE(E d){}13 public static void main(String[] args) {14 Z z = new Z();15 takesD(z);16 takesE(z.makeE());17 }18 19 }
View Code

内部类还有一些其他特性:

1.内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外围类对象的信息相互独立。

2.在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或继承同一个类。

3.创建内部类对象的时刻并依赖于外围类对象的创建

4.内部类并没有令人迷惑的“is-a” 关系,它就是一个独立的实体。

 
 

转载地址:http://oksfa.baihongyu.com/

你可能感兴趣的文章
ContentValues 和HashTable区别
查看>>
LogicalDOC 6.6.2 发布,文档管理系统
查看>>
给PowerShell脚本传递参数
查看>>
实战2——Hadoop的日志分析
查看>>
利用FIFO进行文件拷贝一例
查看>>
Ecshop安装过程中的的问题:cls_image::gd_version()和不支持JPEG
查看>>
resmgr:cpu quantum等待事件
查看>>
一个屌丝程序猿的人生(六十六)
查看>>
Java 编码 UTF-8
查看>>
SpringMVC实战(注解)
查看>>
关于静态属性和静态函数
查看>>
进程的基本属性:进程ID、父进程ID、进程组ID、会话和控制终端
查看>>
spring+jotm+ibatis+mysql实现JTA分布式事务
查看>>
MyBatis启动:MapperStatement创建
查看>>
调查问卷相关
查看>>
eclipse启动无响应,老是加载不了revert resources,或停留在Loading workbench状态
查看>>
1. Git-2.12.0-64-bit .exe下载
查看>>
怎样关闭“粘滞键”?
查看>>
[转]React 教程
查看>>
拓扑排序介绍
查看>>