嵌套类与内部类巩固:
在上一次https://www.cnblogs.com/webor2006/p/11333101.html学到了Kotlin的嵌套类与内部类,回顾一下:
![](https://i-blog.csdnimg.cn/blog_migrate/12dfd2605f05b086b537c36d1a50e835.png)
而对于嵌套类:
![](https://i-blog.csdnimg.cn/blog_migrate/92c78e4b1a5e2b75ad2c2fdbb3b571c3.png)
归根结底就是因为静态的类只能去访问静态的成员,所以,一个嵌套类其实是可以访问另一个同层次的嵌套类的,因为它本身就是静态的嘛,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/2cd57578cae806fb6cd0a9c52318c889.png)
所以“嵌套类不能访问外部类的其他成员,只能访问另一个嵌套类”。
下面继续来探究嵌套类与内部类的东东,如何在一个类的外面来声明和创建嵌套类或内部类的对象呢?下面瞅下:
![](https://i-blog.csdnimg.cn/blog_migrate/47df6f45e3384368e22e39d979a228c1.png)
接下来瞅一下内部类的情况:
![](https://i-blog.csdnimg.cn/blog_migrate/6413028fb40091beee89871d119096f1.png)
其实这俩的使用在上一次的学习中已经学过了,这里再来对其进行巩固一下。
对象表达式【object expression】:
这个是Kotlin提供的一个特别重要的一个特性,在Android kotlin的开发中会大量使用它,所以需要好好学习,先来看一下对象表达式是啥?Java当中匿名内部类在很多场景下都得到了大量使用,Kotlin的对象表达式就是为了解决匿名内部类的一些缺陷而产生的。先来回顾一下在Java中匿名内部类的特点:
1、匿名内部类是没有名字的类。
2、匿名的内部类一定是继承了某个父类,或是实现了某个接口。
3、Java运行时会将该匿名内部类当做它所实现的接口或是所继承的父类来看待。
而在我们Android开发中对于各个View的事件监听全是采用匿名内部类的方式,所以是非常重要的概念,下面来看一下Kotlin对象表达式的语法格式:
![](https://i-blog.csdnimg.cn/blog_migrate/7b4d96d845c79c3174ac077223052e7c.png)
接下来则用代码来演练一下,先定义一个接口和抽象类:
![](https://i-blog.csdnimg.cn/blog_migrate/0bc66909a87322ae10bca9d80b354aed.png)
然后接下来使用一下:
![](https://i-blog.csdnimg.cn/blog_migrate/0e1e55c4188d716dad85b38bf923966d.png)
其中报错了,其实也能猜出啥错误:
![](https://i-blog.csdnimg.cn/blog_migrate/303a7314223d5d6cb8d0fadb5b1fc1b0.png)
![](https://i-blog.csdnimg.cn/blog_migrate/76d6d90272f2a0c71d389641b5a0814d.png)
是不是从这个对象表达式就看到了以前Java匿名内部类的身影了?是的,接下来继续修改程序,不同点就出来啦,在Kotlin匿名内部类是可以不去实现任何接口的,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/ea72f80b87b2f25c2829e0202255dd25.png)
这个确实是跟Java不一样了,这段代码别看简单,其实是有一些隐晦的东东,在之后再来揭露,继续修改:
![](https://i-blog.csdnimg.cn/blog_migrate/cfc4ea89f17825abb20bd0a71d0d9425.png)
很明显Kotlin为我们打开了Java的一些限制,在Java的匿名内部类一定是继承了某个父类,或是实现了某个接口,不可能既实现某个接口又继承某个父类。接下来咱们再将里面的方法给实现:
![](https://i-blog.csdnimg.cn/blog_migrate/efcee4c50695c828ecd0aca3a11376b8.png)