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

下面的这些符号任何情况下都被优先解析为关键字,不可以作为任何标识符。

// 数据类型转换 
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会冲突,可以考虑通过别名引入
//  空安全,但是需要处理 Nullable
val obj: Any? = null
val intValueNullable: Int? = obj as? Int
// 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)
    

// 声明类 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
// 同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 
    ...
 while (true)
  • else 定义一个 if 表达式 的 false 时的执行分支.
if (...) 
    ... 
else 
    ...
val bool : Boolean = false
for (i in 1..100) 
    print("print i = $i")
 
fun mainFunction() 
    ...

if (i == 0) ... 
// 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 Comparable<in T> 
    operator fun compareTo(other: T): Int

// 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 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 属性
// 与 java 相比,其package无需与文件的实际路径相关,但是建议保持一致。
package com.unluck.ktdemo.bean  // file://com/unluck/ktdemo/data
// 同 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

// 调用超类方法
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)

throw NoBugException()
val bool : Boolean = true
try 
    ...
 catch ( e : Exception) 
class A 
    inner class Inner

class B 
    inner class Inner


typealias AInner = A.Inner
typealias BInner = B.Inner
  • typeof 保留关键字,暂时没用,可能以后会用.

  • val 声明不可变变量 (只读) 属性 或者 局部变量.

val finalValue : Int = 1
var variable : Int = 1
when 
    a == b -> 
    else -> 


when(a) 
    0 -> 
    else -> 

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
    

try 
    ...
    throw NoBugException("Yes , NO BUG !!! ")
    ...
 catch (e : NoBugException) 
    print("NO BUG ~ ")
 catch (e2 : Exception) 
    print("F..k !!!! ")

class DemoView : View 
    constructor(ctx: Context) : super(ctx) 
        ...
    
    constructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs)

try 
    ...
 finally 
    // optional finally block
 
val isEmpty: Boolean
    get() = this.size == 0
import com.unluck.ktdemo.Demo
class Demo 
    init 
        print("init block")
    

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)
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

以下符号作为声明中修饰符列表中的关键字,并可用作其他上下文中的标识符。

  • abstract 标记为 抽象类 或者抽象方法.

  • actual 多平台 实现方式,该标记表明其实现方式可能由其它平台实现.

@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>
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION,
        AnnotationTarget.TYPE_PARAMETER, AnnotationTarget.VALUE_PARAMETER,
        AnnotationTarget.EXPRESSION)
Kotlin 基础学习  关键字

Kotlin 基础学习 关键字

Kotlin:使Java函数可调用中缀

Kotlin学习与实践 基础

Kotlin学习笔记——接口抽象类泛型扩展集合操作符与Java互操作性单例

Kotlin挂起函数基础