首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Kotlin系列之扩展函数和属性

今天,让我们聊聊Kotlin中的扩展函数和属性的话题。

扩展函数和属性,见名知意,就是可以做到在目前已存在的类的基础上添加函数和属性,只是这些函数和属性定义在类的外部,是不是很好奇呢?那就一起来看看吧。

扩展函数

我们直接来一个例子进行分析,给String类添加一个成员函数,用来获取字符串的最后一个字符。先上代码。

Kotlin代码

对,你没有看错,除了包声明,就只有一行代码,它的定义规则是这样的。。这里的表示一个要扩展的类的对象,在这里就是String对象,所以它可以调用String类的所有可以访问的属性和方法。

接着我们就可以像调用一般的方法一样调用我们的扩展方法了,没有任何差异,就像下面这样。

Kotlin中调用

在使用前必须先导入函数,然后使用调用。

Java中调用

在Java中同样需要导入,只是导入的不是函数,而是以文件名创建的类名,然后像静态方法调用一般调用我们的扩展函数,将字符串作为参数传入即可。

当然Kotlin是一门追求简介的语言,上面的扩展函数还可以省略,就像下面这样。

但请你注意,我们的扩展函数不允许破坏类的封装性,也就是我们在扩展时不能访问到类的私有属性和受保护的属性。

有时候,我们在Kotlin中导入的函数可能会重名,这时我们就可以使用关键字在导入的同时为其其一个别名,调用的时候使用这个别名即可,就像下面这样。

扩展函数不可被重写

其实你要是完全理解了上面的例子,就可以瞬间理解为什么扩展函数不可以被重写。我们看看扩展函数在Java中的调用形式,其实就是调用了一个类的静态方法,这里就涉及到一个Java的知识点,。我们写一个Java的例子来说明以下。

Java代码

然后我们用下面的代码测试以下

输出如下:

这是Java的基础知识了,大家没什么异议吧,那我们接着吧上面的方法修改成的看看,就像下面这样。

测试代码

首先上面的测试代码不会运行出错,可能我们平时不会这样去调用静态方法,这里只是为了说明问题。

运行结果如下

尤其看第三个运行结果,对,这就说明了。如果再深入说以下就是普通成员变量的重写,导致的多态性是由于我们在使用。

上面的规则在Kotlin中同样适用,只是变成了扩展函数不具有多态性(其实你只要记住扩展函数在Java中调用时是被作为静态函数处理的你就能理解了)

下面我们再用Kotlin来重现以下上面的场景。

Kotlin代码

上面的代码涉及到一点新的语法,首先在Kotlin中所有类默认是的,是不可继承的,必须在前面添加修饰符才可以被继承。其次继承不再使用关键字,而是使用,同时,后面的继承类不是写类名,还要写,其实这里面是一体的,这个表示构造函数,这个我们后面的内容会详细介绍。最后注意方法的重写必须在函数前面写关键字。

测试代码

输出结果

现在我们开始扩展这两个类,给这两个类都扩展一个函数,就像下面这样。

下面我们来测试一下扩展函数是否被重写了,也就是是否具备多态性。

输出结果

通过上面有点啰嗦的步骤,我们已经验证了扩展函数不可以被重写。

最后再说一点,如果一个类的成员函数和扩展函数具有相同的方法签名(也就是方法声明一致),那么成员函数会被优先使用。

扩展属性

学会了扩展函数,那么扩展属性学起来就容易一些了。我们仍然说说文章最开始的那个场景,我们为String类定义一个扩展属性,就像下面这样。

由于String是不可变的,所以我们这里扩展属性声明为,同时由于我们扩展的属性并不能真正在类内部,所以我们没法给其赋初值和初始化,因为没有地方存储值,我们只能通过给它添加getter方法让其在被调用时返回值。

当然如果是为StringBuilder扩展属性我们就可以将扩展的属性声明为,并为其添加getter和setter方法,就像下面这样。

你可能刚开始对这种写法有些陌生,没事,后续我们将介绍更多相关的内容。

下面看看在Kotlin和Java中如何调用吧。

使用前肯定要先导入,然后就可以像使用普通属性一样使用就可以啦。

在Java中调用时,则是将写有扩展属性代码的类导入,然后在传参数时需要传入扩展的类的对象和要设置的值,像静态函数一样调用他们的geteer和setter方法。

写在最后

Kotlin的扩展函数和属性,增加代码设计的灵活性,我们可以在现有类的基础上进行扩展和修改,定制我们自己的类,这也极大地方便了Kotlin的Java的互操作。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180125G033BH00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券