JAVA-初步认识-第十章-匿名内部类-概述

一.

匿名内部类,内部类的匿名格式。之前学习过的匿名,是匿名对象。匿名对象是对象的简写格式。这里的匿名类也是如此。

简写是为了方便,三元运算符也是如此。刚开始写匿名内部类有点变扭,写多了就习惯了。

匿名内部类的简写有一个前提,不是所有内部类都能简写的。

简写都要有前提。if esle变简写必须有运算结果。

内部类匿名的前提表明,内部类必须和外面有关系,没关系不行。(这里有关系的外部类可以是内部类所属的外部类么?下面的例子中实现的是其他的类。应该不能是内部类所属的外部类,因为这样继承或者实现,就有一种循环嵌套的意思,自己又继承了外部类里面的内部类,这是我个人的理解。)

先写一个常见的内部类,

 

(这里内部类位于外部类的成员位置上,成员函数想要访问内部类的话,必须要创建类的对象,因为说是访问对象,实际上是调用类中的方法,如果不是调用类中的内容,那怎么算得上访问类呢?这里单纯的是这个成员函数想要访问类,)

截图中是最为常见的内部类程序书写格式。在method()方法中,创建的内部类对象只调用了一次方法,那么按照之前匿名对象的规则。这里可以写成匿名对象的形式,这只是针对创建对象的匿名,而不是内部类的匿名。一个是创建对象的匿名,另一个是类的匿名,两者不一样。

视频中介绍到这里说,匿名类就是说类没名字,如下,这样就糟糕了(一个类怎么能没名字呢?)

内部类没有类名,那么new什么呢?这就是纠结的地方,(这怎么理解?什么叫匿名类就是没有类名?之前的匿名对象,也没有对象名,这里是说没有类名么?换种正确的写法就可以有类名了么?)

 要想实现内部类没有名字,成就匿名类,就必须按照前提来,

正规地按照继承的说法,就应该如上图所示,只是这里的内部类类名是Outer$Inner而已,而且继承后,将Demo中的show()方法复写了,然后在接下里的成员函数中创建匿名对象,同时调用方法,这是没有问题的。

现在内部类达到了匿名内部类的前提,如果把它换成没名字的话,该如何来写。

在成员函数中写成new Inner就挂了,因为涉及到内部类的名字了

按上图所写,才是没名字。inner没了,现在只能new它爹,如果连前提都没有,那我new谁呢?接下里new了一下Demo,出事没?

出事了,Demo是抽象的,不写抽象的就没问题了?还是没抓住核心。这里有两部分,一个是new的部分,一个是调用的部分。如果把抽象对象复写了,那就可以创建对象了。方法是不是要封装起来?是的,下图不能写分号,写分号是创建对象。

后面直接写大括号,这叫new了一个Demo类的子类对象,因为只有子类才有权利覆盖show方法,我把覆盖的方法,定义在这个区间当中。带着内容的对象,

这个就是匿名内部类。(对这里匿名内部类的认识:一是内部类确实没了名字,二是内部类的位置在局部位置上,而不是成员位置上)

其实说白了,就是new个对象,对象还带着内容,能带内容的对象是Demo的子类,因为只有子类才能覆盖方法,

按照上图的说法,它还是一个类么,它不是子类的对象么?

匿名不匿名,不管,其实就是子类对象,它就是做了一个简化封装动作。按理说,咱要搞一个类去继承它爹,覆盖它的方法,接着再成员函数中new对象,调用方法。现在是一气呵成,连复写和new对象一起搞定,

具体匿名内部类的格式如下

还可以对匿名内部类进行程序的扩展,里面添加了一个haha方法,子类对象中除了继承来的方法,还有自己特有的方法,这是没有问题的。

这些所讲的是一种简写格式,看着有些变扭,但是实际上还是下图的体现,

 

 再回过头来看,匿名内部类格式写完后,我们实现了子类继承时方法的复写,new对象,还差一个调用方法,接下来就补充调用。

 

下面就是说怎么在主函数中实现了这样的程序了。为什么这里会有这样的疑惑?还是对内部类的使用不熟悉

下面截图中蓝底覆盖的部分就是匿名内部类,

要始终牢记,这是内部类的简写格式,省去了类名,所以叫做匿名内部类。它一样是由弊端的。

说实话,但看这形式,确实是分布在类里面的一个子类对象的简写,将位于里面的子类进行了简化。

 

posted @ 2017-11-15 21:30  前锋营  阅读(185)  评论(0编辑  收藏  举报