不要与默认参数争论
Kotlin词汇
短而易于使用,默认参数允许您在没有样板的情况下实现功能过载。像许多Kotlin功能一样,这感觉就像魔术。您好奇地学习它的秘密吗?请继续阅读以了解默认论点如何在引擎盖下工作。
基本用法
如果您需要超载函数,而不是多次实现相同的函数,则可以使用默认参数:
默认参数也可以应用于构造函数:
Java Interop
默认情况下,Java无法识别默认值过载:
要指示编译器生成过载方法,请使用@jvmoverloads
kotlin功能上的注释:
在引擎盖下
让我们看一下Java分解代码,以了解编译器为我们生成的内容:工具 - > kotlin->显示kotlin bytecode
然后按反编译
按钮。
功能
我们看到编译器生成2个函数:
玩
- 有1个参数:玩具
当未使用默认参数时称为- 合成方法
播放$ default
- 有3个参数:玩具
, 一个int
和目的
;每当使用默认参数时,都称为称为。这目的
参数始终是无效的
但是INT的价值有所不同。让我们看看如何!
int参数
int参数的值播放$ default
根据传递默认参数的参数的数字和索引计算。基于此参数的值,Kotlin编译器知道要调用play函数的哪些参数。
在我们的玩()
示例调用,索引0的参数使用默认参数。所以,播放$ default
被称为int var1 =2⁰
:
播放$ default((玩具)null,1,(对象)null);
这播放$ default
然后,实施知道的价值var0
应替换为默认值。
让我们以一个更复杂的示例来查看INT参数的表现。让我们扩大我们的玩
功能,在呼叫网站上,使用默认参数狗狗
和玩具
:
让我们看看分解代码中发生了什么:
我们看到,现在,我们的int参数为5。这是计算的方式:位置0和2处的参数使用默认参数,因此var3 =2⁰ +2²= 5
。在一个钻头和
手术,将参数评估为这样:
var3&1!= 0
是真的
所以var0 = gooddoggo
var3&2!= 0
是错误的
所以var1
未更换var3&4!= 0
是真的
所以var2 =吱吱作响
基于应用于var3
,编译器可以计算哪些参数应替换为默认值。
对象参数
在上面的示例中,您可能已经注意到目的
参数始终为null,实际上从未在播放$ default
功能。此参数连接到支持覆盖函数中的默认值。
默认参数和继承
当我们想用默认参数覆盖函数时会发生什么?
让我们更改上面的示例,并:
- 制作
玩
一个打开
功能狗狗
和狗狗
一个打开
班级。 - 创建一个新的
PlayfulDoggo
班级,扩展狗狗
和覆盖玩
当我们要在PlayfulDoggo中设置默认值时。玩我们不允许我们:不允许覆盖函数为其参数指定默认值
如果我们删除覆盖
我们检查了分解代码,PlayfulDoggo.play()
看起来这样:
这是否意味着将来会支持带有默认参数的超级呼叫?我们只需要拭目以待。
构造函数
对于构造函数,分解的Java代码只有一个差异。让我们来看看:
构造函数还创建了合成方法,但不是目的
在功能中使用,构造函数使用DefaultConstructorMarker
被称为无效的
:
带有默认参数的辅助构造函数还将使用一个DefaultConstructorMarker
,例如主要的构造函数:
结论
简单而甜美的默认参数减少了处理超载方法时需要编写的样板代码的数量,从而使我们可以为参数设置默认值。与许多Kotlin关键字一样,当可以通过窥视它为我们编写的代码来理解他们的魔法时。查看我们的其他Kotlin词汇帖子以获取更多信息。