Kotlin的入门(一)

kotlin的入门(一)

变量声明

val 用于值从不更改的变量。使用 val 声明的变量无法重新赋值。

var 用于值可以更改的变量

val languageName: String = "Kotlin"
var count: Int = 10
count = 15
类型推断

Kotlin 编译器可根据所赋值的类型来推断其类型

由于 "Kotlin" 的值为 String 类型,因此编译器推断 languageName 也为 String

Kotlin 是一种静态类型的语言。这意味着,类型将在编译时解析且从不改变

val languageName = "Kotlin"
val upperCaseName = languageName.toUpperCase()
// Fails to compile
languageName.inc()

inc() 是一个 Int 运算符函数,因此无法对 String 调用它

利用 Kotlin 的类型推断,既能确保代码简洁,又能确保类型安全

Null 安全

在某些语言中,可以声明引用类型变量而不明确提供初始值

这种情况下,变量通常包含 null 值.默认情况下,Kotlin 变量不能持有 null 值

// Fails to compile
val languageName: String = null

要使变量持有 null 值,它必须是可为 null 类型。可以在变量类型后面加上 ? 后缀,将变量指定为可为 null,如以下示例所示:

val languageName: String? = null

必须小心处理可为 null 的变量,否则可能会出现NullPointerException

条件语句
  1. if else 或 if else if

与Java类似

if (count == 42) {
    println("I have the answer.")
} else if (count > 35) {
    println("The answer is close.")
} else {
    println("The answer eludes me.")
}

条件表达式:

  • 赋值
val answerString : String = if (count == 42){
    "I have the answer."
}else {
    "The answer eludes me."
}
println(answerString)
  • when
val answer = when{
    count == 42 -> "I have the answer."
    count > 35 -> "The answer is close."
    else -> "The answer eludes me."
}
println(answer)

when 表达式 每个分支都由条件,"->"和结果来表示。如果箭头左侧的条件求值为 true,则会返回右侧的表达式结果,when 表达式示例中的代码在功能上与上一个示例中的代码等效,但可能更易懂

函数

要声明函数,请使用 fun 关键字,后跟函数名称。接下来,定义函数接受的输入类型(如果有),并声明它返回的输出类型。函数的主体用于定义在调用函数时调用的表达式

    fun generateAnswerString(countThreshold: Int): String {
        val answerString = if (count > countThreshold){
            "I have the answer."
        }else{
            "The answer eludes me"
        }
       return  answerString
    }
   val ans = generateAnswerString(35)
   println(ans)
简化函数声明

函数返回单个表达式的结果时,可以通过直接返回函数中包含的 if-else 表达式的结果来跳过声明局部变量,如以下示例所示

fun generateAnswerString(countThreshold: Int): String {
    return if (count > countThreshold) {
        "I have the answer."
    } else {
        "The answer eludes me."
    }
}

还可以将 return 关键字替换为赋值运算符:

fun generateAnswerString(countThreshold: Int): String = if (count > countThreshold) {
        "I have the answer"
    } else {
        "The answer eludes me"
 }
匿名函数

并非每个函数都需要一个名称。某些函数通过输入和输出更直接地进行标识。这些函数称为“匿名函数”。您可以保留对某个匿名函数的引用,以便日后使用此引用来调用该匿名函数。

val stringLengthFunc: (String) -> Int = { input ->
    input.length
}

val stringLength: Int = stringLengthFunc("Android")

在上面的示例中,stringLengthFunc 包含对一个匿名函数的引用,该函数将 String 当作输入,并将输入 String 的长度作为 Int 类型的输出返回。因此,该函数的类型表示为 (String) -> Int。不过,此代码不会调用该函数。要检索该函数的结果,您必须像调用命名函数一样调用该函数。调用 stringLengthFunc 时,必须提供 String

高阶函数

一个函数可以将另一个函数当作参数。将其他函数用作参数的函数称为“高阶函数”。此模式对组件之间的通信(其方式与在 Java 中使用回调接口相同)很有用

private fun stringMapper(str:String, mapper: (String)-> Int):Int{
    return  mapper(str)
}

要调用 stringMapper(),可以传递一个 String 和一个满足其他输入参数的函数(即,一个将 String 当作输入并输出 Int 的函数)

val length = stringMapper("Android",{input ->input.length})
println(length)
val lengthT =  stringMapper("HelloWorld",stringLengthFunc)
println(lengthT)

如果匿名函数是在某个函数上定义的最后一个参数,则您可以在用于调用该函数的圆括号之外传递它,如以下示例所示

val length = stringMapper("Android") { input -> input.length }

使用 class 关键字来定义类

class Car
属性

类使用属性来表示状态。属性是类级变量,可以包含 getter、setter 和后备字段

class Wheel {
}
class Car {
    val wheels = listOf<Wheel>()
}

请注意,wheels 是一个 public val,这意味着,可以从 Car 类外部访问 wheels,并且不能为其重新赋值。如果要获取 Car 的实例,必须先调用其构造函数。这样,您便可以访问它的任何可访问属性

val car = Car() // construct a Car
val wheels = car.wheels // retrieve the wheels value from the Car

可以定义一个自定义构造函数,用来指定如何初始化类属性:

class Car(val wheels:List<Wheel>)
类函数和封装

类使用函数对行为建模。函数可以修改状态,从而帮助您只公开希望公开的数据。这种访问控制机制属于一个面向对象的更大概念,称为“封装”。

doorLock 属性对 Car 类外部的一切都不公开。要解锁汽车,必须调用 unlockDoor() 函数并传入有效的“钥匙”,如以下示例所示:

class Car(val wheels: List<Wheel>) {
    private val doorLock: DoorLock = ...

    fun unlockDoor(key: Key): Boolean {
        // Return true if key is valid for door lock, false otherwise
    }
}

如果希望公开属性的 getter 而限制访问其 setter,则可以将该 setter 指定为 private

class Car(val wheels: List<Wheel>) {

    private val doorLock: DoorLock = ...

    var gallonsOfFuelInTank: Int = 15
        private set

    fun unlockDoor(key: Key): Boolean {
        // Return true if key is valid for door lock, false otherwise
    }
}

 val  car = Car(listOf<Wheel>());
// Fails to compile
 car.gallonsOfFuelInTank = 1

通过结合使用属性和函数,可以创建能够对所有类型的对象建模的类

互操作性

Kotlin 最重要的功能之一就是它与 Java 之间流畅的互操作性。由于 Kotlin 代码可编译为 JVM 字节码,因此 Kotlin 代码可直接调用 Java 代码,反之亦然。这意味着,您可以直接从 Kotlin 利用现有的 Java 库。此外,绝大多数 Android API 都是用 Java 编写的,因此可以直接从 Kotlin 调用它们。

Kotlin for Java developers

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值