Java中引入内部类的作用是什么

  • 时间:
  • 浏览:26
  • 来源:恰卡网

导读这篇文章给大家介绍Java 中引入内部类的作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 Java的优点是什么 1. 简单,只需理解基本的概念,就可以编写适...

这篇文章给大家介绍Java 中引入内部类的作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

Java的优点是什么

1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向对象;3. 分布性,Java是面向网络的语言;4. 鲁棒性,java提供自动垃圾收集来进行内存管理,防止程序员在管理内存时容易产生的错误。;5. 安全性,用于网络、分布环境下的Java必须防止病毒的入侵。6. 体系结构中立,只要安装了Java运行时系统,就可在任意处理器上运行。7. 可移植性,Java可以方便地移植到网络上的不同机器。8.解释执行,Java解释器直接对Java字节码进行解释执行。

能不用内部类就不用内部类。

实践

我以前觉得内部类用来有针对性地暴露外部类的特定接口,比一下子把整个对象都给人家要好。比如说下面代码中的外部类Outer实现了三个接口方法,能跑,能飞,能思考。然后有三个方法getRunner(),getFlyer(),getThinker()有针对性地对外暴露部分功能接口。

publicinterfaceRunnable{publicvoidrun();}publicinterfaceFlyable{publicvoidfly();}publicinterfaceThinkable{publicvoidthink();}publicclassOuter{
publicvoidrun(){//dosomething}
publicvoidfly(){//dosomething}
publicvoidthink(){//dosomething}
publicclassRunnerimplementsRunnable{
publicvoidrun(){Outer.this.run();}}
publicclassFlyerimplementsFlyable{
publicvoidfly(){Outer.this.fly();}}
publicclassThinkerimplementsThinkable{
publicvoidthink(){Outer.this.think();}}
publicRunnergetRunner(){returnnewRunner();}publicFlyergetFlyer(){returnnewFlyer();}
publicThinkergetThinker(){returnnewThinker();}}

但实际上直接实现三个接口不是就很好嘛。用内部类根本算不上优雅,多了很多代码。仅仅为了暴露接口根本不需要使用内部类。

publicinterfaceRunnable{publicvoidrun();}publicinterfaceFlyable{publicvoidfly();}publicinterfaceThinkable{publicvoidthink();}publicclassOuterimplements,Runnable,Flyable,Thinkable{
publicvoidrun(){//dosomething}
publicvoidfly(){//dosomething}
publicvoidthink(){//dosomething}}

再或者说常见的控制框架。我们定义个Event接口,必须有action()方法。在外部类里定义事件处理的流程。然后定义了几个实现Event接口的内部类。

publicinterfaceEvent{publicvoidaction();}publicclassController{
privateintid;
privateListlist=newArrayList();
publicvoidprepare(){//putneweventsintothelist}
publicvoiddoEvents(){//doeveryeventsinthelist}
publicclassAimplementsEvent{
publicvoidaction(){//dosomething}}
publicclassBimplementsEvent{
publicvoidaction(){//dosomething}}}

但这也不是非内部类不可。独立定义A,B类,最后再把Event对象组合到Controller里完全可以,而且更简洁易读。

另外,说到内部类,经常会提到闭包,回调。但内部类也不是唯一的方案。简单的继承,组合都能实现同等的数据封装效果。

但Java到底需不需要内部类?答案还是需要的。Java引入内部类的真正意义就在于,还是有很多情况,没有内部类是处理不了的,或者用内部类处理起来更加优雅。

还是第一个例子。如果外部类不止有一种接口实现方法。如果我实现了Runnable接口,就只能定义一个run()方法。这时候内部类就派用场了。比如,企鹅既会跑,又会游泳。所以它的两个内部类实现两种不同的run()。可以返回两种不同的Runnable引用。

publicinterfaceRunnable{publicvoidrun();}publicclassPenguin{
publicvoidrun(){//dosomething}
publicvoidswim(){//dosomething}
publicclassRunningimplementsRunnable{
publicvoidrun(){Penguin.this.run();}}
publicclassSwimmingimplementsRunnable{
publicvoidrun(){Penguin.this.swim();}}
publicRunnergetRunner(){returnnewRunning();}publicFlyergetSwimmer(){returnnewSwimming();}}

另一种典型场景就是多继承。如果外部类已经继承了某个基类,比如说企鹅继承自鸟类。但Runnable这时候正好是一个abstract抽象类呢?Java不支持多继承,内部类可以解决这个问题。

publicclassBird{//somecodehere}
publicabstractclassRunnable{
publicabstractvoidrun();}
publicclassPenguinextendsBird{
publicclassRunnerextendsRunnable{//dosomething}
publicRunnerpenguinCanRun(){returnnewRunner();}}

刚才提到了控制框架可以不用内部类。但实际上你看看事件驱动的Swing里到处都是内部类。为什么呢?因为有大量的事件,而且多数事件的相应方法只被用到了一次。用内部类是为了控制类的数量,考虑的是更好地封装。

内部类另外一个好的特性就是它独立于外部类,不会像组合一样随着外部类的初始化而一起被初始化。而是在我们需要它的时候再创建它。比如说容器里的迭代器,需要我们手动创建。作为可选组件存在于外部类中,不会增加外部类的负担。

关于Java 中引入内部类的作用是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

猜你喜欢

飞利浦278E1显示器体验如何(飞利浦278E1显示器体验评测)

飞利浦278E1显示器体验如何,飞利浦278E1显示器体验评测 目前27寸显示器已经成为了市面上的主流产品。这样尺寸的显示器在桌面上,整体的观感更好,再搭配了更高的分辨率,让显示器可以显示

2021-06-22

Python(中的单分派泛函数你真的了解吗)

Python,中的单分派泛函数你真的了解吗 泛型,如果你学过Java ,应该对它不陌生吧。但你可能不知道在 Python 中(3.4+ ),也可以实现简单的泛型函数。 在Python中只能实现基于单个(第一个)参

2021-06-22

Java8新特性:函数式编程

Java8新特性:函数式编程 首先需要清楚一个概念:函数式接口;它指的是有且只有一个未实现的方法的接口,一般通过FunctionalInterface这个注解来表明某个接口是一个函数式接口。函数式接口是

2021-06-22

Python实现DBSCAN聚类算法并样例测试

Python实现DBSCAN聚类算法并样例测试 什么是聚类算法?聚类是一种机器学习技术,它涉及到数据点的分组。给定一组数据点,我们可以使用聚类算法将每个数据点划分为一个特定的组。理论上,

2021-06-22