Kotlin 基础学习 关键字
Posted CrazyApes
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin 基础学习 关键字相关的知识,希望对你有一定的参考价值。
Kotlin
线上编写练习
Kotlin官网提供了 PlayGround 供大家线上尝试
地址:https://play.kotlinlang.org/
原文:https://www.jianshu.com/p/ae5f15ceb9b0
文章目录
前言
本来没打算把关键字
介绍放在第一部分,可是发现,如果不放在这儿,后面很多用到关键字的地方会有很多不明白不了解的情况。
所以还是把关键字的介绍放在了第一部分,不需要全部记住,但是在后面看到的时候,可以随时翻到这篇文章,可以做一个简单的了解。
本文简单的介绍了Kotlin
中使用的部分常用关键字。
希望对大家初步了解Kotlin
有所帮助。
关键字
Kotlin 官网文档
Keywords
https://kotlinlang.org/docs/keyword-reference.html
Kotlin 的关键字
大致可以分为 三类:
- Hard keywords 硬关键字
任何情况下都被优先解析为关键字
,不可以作为任何标识符。 - Soft keywords 软关键字
在某些起作用的上下文中作为关键字
,在其不起作用的上下文中可以作为标识符使用。 - Modifier keywords 修饰符关键字
可以作为修饰符的关键字
,也可以在其它地方用作标识符 - Special identifiers 特殊标识符
可以由编译器在特定上下文中定义,它们可以在其他上下文中用作常规标识符 - Operators and special symbols 运算符和特殊符号
一些常见运算符和特殊符号
硬关键字 Hard Keywords
Kotlin 官网文档
Hard Keywords
https://kotlinlang.org/docs/keyword-reference.html#hard-keywords
下面的这些符号任何情况下都被优先解析为关键字
,不可以作为任何标识符。
as
- 一般是用于 类型转换.
- 也可以用于 import 时的别名设置
// 数据类型转换
val obj: Any = 1
// 可能会抛出 java.lang.ClassCastException,可以考虑 is 或者 as? 替代
val intValue: Int = obj as Int
// 处理Nullable
val intValueNullable: Int? = obj as? Int
// is 之后可以直接使用对应属性
if (obj is Int)
print("$obj.plus(1)")
==================================================
// import 别名设置
import com.unluck.ktdemo.DemoClass
import com.unluck.ktdemo.bean.DemoClass as DemoBean // 同时引入DemoClass会冲突,可以考虑通过别名引入
as?
用于 安全的类型转换.
// 空安全,但是需要处理 Nullable
val obj: Any? = null
val intValueNullable: Int? = obj as? Int
break
终止一个循环操作.
// break 终止 for
for (i in 1..100)
if (...) break
// break to labels 可以声明labels 终止指定的for循环
breakToThis@ for (i in 1..100)
for (j in 1..100)
if (...) break@breakToThis // 终止 breakToThis@ for(i)
class
声明一个类.
// 声明类 DemoClass
class DemoClass
// 声明类 MainActivity 并继承自 AppCompatActivity
class MainActivity : AppCompatActivity()
// 声明类 DemoTextView 并继承自 AppCompatTextView
class DemoTextView(ctx : Context) : AppCompatTextView(ctx)
// 声明数据类 DemoBean 并实现 Serializable 接口
data class DemoBean(val name: String) : Serializable
continue
继续当前循环的下一个循环.
// 同break使用方式类似
for (i in 1..100)
if (...) continue
// continue to labels 可以声明labels 继续指定的for循环的下一个循环
continueToThis@ for (i in 1..100)
for (j in 1..100)
if (...) continue@continueToThis
do
do/while 循环 (a loop with a postcondition) 的开始标识.
do
...
while (true)
else
定义一个 if 表达式 的 false 时的执行分支.
if (...)
...
else
...
false
Boolean 值的 false 值.
val bool : Boolean = false
for
开始一个 for 循环.
for (i in 1..100)
print("print i = $i")
fun
声明一个 函数.
fun mainFunction()
...
if
if 表达式 的起始.
if (i == 0) ...
in
- 指定在 for 循环中迭的对象.
- 用作 infix 中缀操作符检查值属于 range, 集合类, 或者其它 定义了 ‘contains’ 方法 的实体类.
- 用在 when 表达式 表示上面那个中缀检查.
- 标记一个类型参数为 逆变.
// for 迭代
for (i in 6 downTo 0 step 2)
println(i)
// check in range
if (3 in 0..4)
// check contains
val list = arrayListOf<Any>()
if ( "1" in list )
...
// when branch
val num = 3
when
num in 0..4 -> print("the num $num is in range 0-4")
else ->
// 逆变参数
interface Comparable<in T>
operator fun compareTo(other: T): Int
!in
- 用作 infix 中缀操作符检查值不属于 range, 集合类, 或者其它 定义了 ‘contains’ 方法 的实体类.
- 一般就是用于 when 表达式的不属于,和上面用于 when 表达式的含义相反.
// check not in range
if (6 !in 0..4)
// check contains
val list = arrayListOf<Any>()
if ( "1" !in list )
...
// when branch
val num = 7
when
num !in 0..4 -> print("the num $num is not in range 0-4")
else ->
interface
声明一个 interface 接口.
interface Comparable<in T>
operator fun compareTo(other: T): Int
is
- 检查 value 是否是指定的类型 .
- 也可以在 when 表达式中使用.
// check value typecasts
if ( obj is Int)
...
// when branch
when (value)
is GroupMsg -> print("this is group message")
else -> print("other message")
-
!is
- 跟上面
is
功能相对
- 跟上面
-
null
就是null
啊,表示对象没有任何对象引用.
val nullableValue : Any? = null
object
用于同时声明了 一个类和它的实例.- 声明全局单例 singleton
- 声明伴生对象 companion object
- 作对象表达式 object expression
// 全局单例
object SingletonClass
var mInstanceValue = 999
fun singletonFunString() = "Singleton Class"
// 伴生对象
class DemoUtil
companion object
@JvmStatic
fun companionObjectFun() = "this is companion object function"
// 对象表达式 -> 某个Any对象
val helloWorld = object
val hello = "Hello"
val world = "World"
// object expressions extend Any, so `override` is required on `toString()`
override fun toString() = "$hello $world"
// 对象表达式 -> 实现某个接口
window.addMouseListener(object : MouseAdapter()
override fun mouseClicked(e: MouseEvent) /*...*/
override fun mouseEntered(e: MouseEvent) /*...*/
)
// 对象表达式 -> 实现抽象类
open class A(x: Int)
public open val y: Int = x
interface B /*...*/
val ab: A = object : A(1), B
override val y = 15
package
指定 当前文件的 package , 与实际文件路径无关.
// package 仅代表当前文件所属的 package 属性
// 与 java 相比,其package无需与文件的实际路径相关,但是建议保持一致。
package com.unluck.ktdemo.bean // file://com/unluck/ktdemo/data
return
从当前函数返回.
// 同 java 类似,从当前函数返回
fun foo()
listOf(1, 2, 3, 4, 5).forEach
if (it == 3) return // non-local return directly to the caller of foo()
print(it)
println("this point is unreachable")
// result -> 12
// 在 forEach 中使用 labels 则类似 continue , 其实 return 的是执行的 lamda
fun foo()
listOf(1, 2, 3, 4, 5).forEach lit@
if (it == 3) return@lit // local return to the caller of the lambda - the forEach loop
print(it)
print(" done with explicit label")
// result -> 1245 done with explicit label
super
// 调用超类方法
class Circle() : Shape()
override fun draw()
super.draw()
println("Circle")
// 调用超类构造
class DemoView : View
constructor(ctx: Context) : super(ctx)
constructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs)
-
this
-
throw
抛出一个异常.
throw NoBugException()
true
Boolean type value true.
val bool : Boolean = true
try
...
catch ( e : Exception)
typealias
声明一个 类型别名.
class A
inner class Inner
class B
inner class Inner
typealias AInner = A.Inner
typealias BInner = B.Inner
val finalValue : Int = 1
var variable : Int = 1
when
when 表达式 .
when
a == b ->
else ->
when(a)
0 ->
else ->
while
while 循环表达式 .
while (true)
...
软关键字 Soft Keywords
Kotlin 官网文档
Soft Keywords
https://kotlinlang.org/docs/keyword-reference.html#soft-keywords
下面的这些符号在其适用的上下文中充当关键字,并且可以在其他上下文中用作标识符。
interface Printer
fun print()
class DefaultPrinter : Printer
override fun print()
print("default printer")
class DemoFragment : Fragment(), Printer by DefaultPrinter() // 委托实现接口
val vm : ViewModel by viewModels() // 委托属性
fun doSomePrint()
print() // print -> default printer
catch
处理捕获的异常信息.
try
...
throw NoBugException("Yes , NO BUG !!! ")
...
catch (e : NoBugException)
print("NO BUG ~ ")
catch (e2 : Exception)
print("F..k !!!! ")
constructor
声明构造函数.
class DemoView : View
constructor(ctx: Context) : super(ctx)
...
constructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs)
-
delegate
用作注解相关. -
dynamic
引用一个 Kotlin/JS 代码中的 dynamic type (动态类型).
在面向 JVM 平台的代码中不支持动态类型 -
field
用作 注解相关. -
file
用作 注解相关. -
finally
标识 当 try 块退出时总会执行的代码块.(不保证立刻执行)
try
...
finally
// optional finally block
get
- 声明 属性的 get 方法.
- 用作 注解相关.
val isEmpty: Boolean
get() = this.size == 0
import
将另一个包中的声明导入当前文件.
import com.unluck.ktdemo.Demo
init
声明 初始化代码块.
class Demo
init
print("init block")
-
param
用作 注解相关. -
property
用作 注解相关. -
receiver
用作 注解相关. -
set
- 声明 属性的 setter.
- 用作 注解相关.
var setterVisibility: String = "abc"
private set // the setter is private and has the default implementation
var setterWithAnnotation: Any? = null
@Inject set // annotate the setter with Inject
// To declare an inline class, use the value modifier before the name of the class:
value class Password(private val s: String)
where
指定泛型类型参数的约束.
fun <T> copyWhenGreater(list: List<T>, threshold: T): List<String>
where T : CharSequence,
T : Comparable<T>
return list.filter it > threshold .map it.toString()
修饰符关键字 Modifier keywords
Kotlin 官网文档
Modifier keywords
https://kotlinlang.org/docs/keyword-reference.html#modifier-keywords
以下符号作为声明中修饰符列表中的关键字,并可用作其他上下文中的标识符。
@SinceKotlin("1.1") public actual typealias RandomAccess = java.util.RandomAccess
@SinceKotlin("1.1") public actual typealias ArrayList<E> = java.util.ArrayList<E>
@SinceKotlin("1.1") public actual typealias LinkedHashMap<K, V> = java.util.LinkedHashMap<K, V>
@SinceKotlin("1.1") public actual typealias HashMap<K, V> = java.util.HashMap<K, V>
@SinceKotlin("1.1") public actual typealias LinkedHashSet<E> = java.util.LinkedHashSet<E>
@SinceKotlin("1.1") public actual typealias HashSet<E> = java.util.HashSet<E>
annotation
声明一个 注解类.
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION,
AnnotationTarget.TYPE_PARAMETER, AnnotationTarget.VALUE_PARAMETER,
AnnotationTarget.EXPRESSION)
Kotlin 基础学习 关键字