[TOC]
有时候可以通过给对象插入多个成员函数做区别是很方便的:
多重声明一次创建了多个变量。我们声明了俩个新变量:name age 并且可以独立使用:
也可以在 for 循环中用:
map:
函数操作符是<code>:</code>
is !is 表达式: 类似Java的instanceof
“不安全”的转换符,如下的x不能为空,否则抛异常:
"安全"转换符,如下不管 as? 右边的是不是一个非空 String 结果都会转换为可空的:
如果 this 没有应用者,则指向的是最内层的闭合范围。为了在其它范围中返回 this ,需要使用标签:<code>this@lable</code>
在 kotlin 中有两种相等:
参照相等: <code>===</code>,参照相等是通过 === 操作符判断的(不等是!== ) a===b 只有 a b 指向同一个对象是判别才成立。另外,你可以使用内联函数<code>identityEquals()</code> 判断参照相等。
结构相等: <code>==</code>,结构相等是通过 == 判断的。像<code>a == b</code>将会翻译成:<code>a?.equals(b) ?: b === null</code>,如果 a 不是 null 则调用 equals(Any?) 函数,否则检查 b 是否参照等于 null。
<a href="http://kotlinlang.org/docs/reference/operator-overloading.html">http://kotlinlang.org/docs/reference/operator-overloading.html</a>
安全调用在链式调用是是很有用的。比如,如果 Bob 是一个雇员可能分配部门(也可能不分配),如果我们想获取 Bob 的部门名作为名字的前缀,就可以这样做:
Elvis 操作符:
也可以使用 Elvis 操作符<code>?:</code>:
如果 ?: 左边表达式不为空则返回,否则返回右边的表达式。注意右边的表带式只有在左边表达式为空是才会执行。
!!操作符:
第三个选择是 NPE-lovers。我们可以用 b!! ,这会返回一个非空的 b 或者抛出一个 b 为空的 NPE:
安全转换:
普通的转换可能产生 ClassCastException 异常。另一个选择就是使用安全转换,如果不成功就返回空:
所有的异常类都是 Exception 的子类。使用方式与Java类似。
注解是一种将元数据附加到代码中的方法。声明注解需要在类前面使用 annotation 关键字:
用法:在多数情形中 @ 标识是可选的。只有在注解表达式或本地声明中才必须
如果要给构造函数注解,就需要在构造函数声明时添加 constructor 关键字,并且需要在前面添加注解:
注解可以有带参数的构造函数:
注解也可以用在 Lambda 中。这将会应用到 lambda 生成的 invoke() 方法:
java 注解在 kotlin 中是完全兼容的。
如果java 中的 value 参数有数组类型,则在 kotlin 中变成 vararg 参数:
注解实例的值在 kotlin 代码中是暴露属性。
得到运行时的类引用:
引用是一种 KClass类型的值。你可以使用<code>KClass.properties</code> 和<code>KClass.extensionProperties</code>获取类和父类的所有属性引用的列表。
函数引用
使用<code>::</code>操作符:
这里<code>::isOdd</code>是是一个函数类型的值<code>(Int) -> Boolean</code>
下面是返回一个由两个传递进去的函数的组合。现在你可以把它用在可调用的引用上了:
属性引用
访问顶级类的属性,我们也可以使用<code>::</code>操作符:
<code>::x</code>表达式评估为<code>KProperty<Int></code>类型的属性,它允许我们使用<code>get()</code>读它的值或者使用名字取回它的属性。
对于扩展属性:
与 java 反射调用
想找到一个备用字段或者 java getter 方法:
构造函数引用
只需要使用<code>::</code>操作符并加上类名。下面的函数是一个没有参数并且返回类型是<code>Foo</code>:
为了方便使用,<code>dynamic</code>应而生:
<code>dynamic</code>类型关闭了 kotlin 的类型检查:
这样的类型可以分配任意变量或者在任意的地方作为参数传递 任何值都可以分配为dynamic 类型,或者作为参数传递给任何接受 dynamic 类型参数的函数 这样的类型不做 null 检查
<code>dynamic</code>最奇特的特性就是可以在<code>dynamic</code>变量上调用任何属性或任何方法。
动态调用可以返回<code>dynamic</code>作为结果,因此我们可以轻松实现链式调用:
当给动态调用传递一个 lambda 表达式时,所有的参数默认都是<code>dynamic</code>:
参考:
<a href="http://kotlinlang.org/docs/reference/basic-syntax.html">http://kotlinlang.org/docs/reference/basic-syntax.html</a>
<a href="http://huanglizhuo.gitbooks.io/kotlin-in-chinese">http://huanglizhuo.gitbooks.io/kotlin-in-chinese</a>