写点什么

Android Studio 上 Kotlin 的入门,一次关于 JVM 的面试经历

发布于: 2021 年 11 月 08 日

知道了 Kotlin 是什么,那我们就先用 Android Studio 来创建你的第一个 Kotlin 应用吧


创建 Kotlin 应用很简单,所有的步骤都和创建 Java 应用是一样的,只需在创建时,将所使用的语言改为 Kotlin 就行



创好了后,我们打开 MainActivity,可以看到,比起 java,Kotlin 的代码要少一些,写类和方法的语法规则也不同。


class MainActivity : AppCompatActivity() {


override fun onCreate(savedInstanceState: Bundle?) {


super.onCreate(savedInstanceState)


setContentView(R.layout.activity_main)


}


}


Kotlin 的基本语法规则




Kotlin 每一行代码的结尾是不用加分号的

变量

在 Kotlin 中定义变量的方式和 java 区别很大,Kotlin 定义变量时,只允许在变量前声明两种关键词:val 和 var


val(value 的缩写),它用来声明一个不可变的变量。这种变量在初始初始赋值之后,就不能再被复制了,相当于 java 中用 final 声明。


var(variable 的缩写),它用来声明一个可变的变量。这种变量在初始赋值之后依旧可以重新赋值。


常量与变量都可以没有初始化值,但是在引用前必须初始化


编译器支持自动类型判断,即声明时可以不指定类型,由编译器判断。


val x: Int = 10 //完整的声明变量


val y = 10 // 不指定变量类型,系统自动推断变量类型为 Int


val z: Int // 如果不在声明时初始化值,则必须提供变量类型


z = 10 //对不可变的变量明确赋值,赋值后不能再次赋值


var a = 1 // 系统自动推断变量类型为 Int


a += 1 // 变量可修改


读者可以看到,Kotlin 中 Int 的首字母是大写的,而 Java 中 int 的首字母是小写的。这是因为 Kotlin 没有使用 Java 的基本数据类型,而是使用了对象数据类型。在 java 中,int 是关键字,而在 Kotlin 中,Int 是一个类,它有自己的方法和数据结构。所以,我们可以给 Int 等对象数据类型添加扩展函数,文章后文的 Toast 简化就是基于此点的。

函数

Kotlin 中定义函数的关键字是 fun(function 的缩写),无论你想定义什么函数,都必须用 fun 进行声明


紧跟在 fun 后面的是函数名,函数名后括号里面放的是接收的参数。参数的格式名是“参数名:参数类型


若是有返回值的话,就将返回值类型以冒号隔开,写在函数名括号的后面;若是没有返回值,可以省略不写,或者写关键字为 Unit,类似与 java 的 void


实例:接收两个不同类型参数,且返回值为 String 的函数


fun functionDemo(parm1 : Int, parm2 : String) : String{


return parm2


}


实例:当一个函数中只有一行代码时,Kotlin 允许我们不必编写函数体,可以直接将唯一的一行代码用等号连接,直接写在函数定义的后面


//改写前


fun sum(parm1: Int, parm2: Int): Int {


return a + b


}


//改写后


fun sum(parm1: Int, parm2: Int) = a + b //返回值类似也省略了,由编译器自动推断类型

匿名函数

Kotlin 支持 lambda 表达式。并非每个函数都需要一个名称。某些函数通过输入和输出更直接地进行标识。这些函数称为“匿名函数”。


lambda 表达式的写法为:(type1,type*) -> type_return = { }


使用实例:


fun main(args: Array<String>) {


val sumLambda: (Int, Int) -> Int = {x,y -> x+y} //(Int, Int) -> Int = {x,y -> x+y}就是一个匿名函数


println(sumLambda(1,2)) // 输出 3


}

字符串模板

字符串可以包含模板表达式,即可求值的代码片段,并将它的结果连接到字符串里面。


字符串模板表达式可以是 {变量名}


实例:


val a = 10


val s1 = "a = $a" // 结果为 "a = 10"


val s = "abc"


val str = "{s.length}" // 结果为 "abc.length is 3"


a = 2


// 模板中的任意表达式:


val s2 = "a"


//结果为“a was 10 , but now is 2 ”


var name = "张三"


var sex = true


var date = "2021 年 1 月 2 日"


var time = "11 点 59 分"


var work ="该睡觉了"


val orderInfo = "你好,{if(sex)"cool boy" else "cool girl" },"+"现在已经是{time}了,"+"你 ${cacke}"


//结果为"你好,张三 cool boy,现在已经是 2021 年 1 月 2 日 11 点 59 分了,你该睡觉了"

注释

Kotlin 支持单行(或行末)与多行(块)注释。


// 这是一个行注释


/* 这是一个多行的


块注释。 */


Kotlin 中的块注释可以嵌套


/* 注释从这里开始


/* 这是嵌套的注释 */


并且在这里结束。 */

Null 安全

在某些语言中,可以声明引用类型变量而不明确提供初始值。在这类情况下,变量通常包含 null 值。默认情况下,Kotlin 变量不能持有 null 值。这意味着以下代码段无效:


// 赋值失败


val languageName: String = null


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


val languageName: String? = null


当使用可以可返回 Null 的函数时,要注意 Null 安全,应该先做判断处理


fun printProduct(arg1: String, arg2: String) {


val x = parseInt(arg1)


val y = parseInt(arg2)


// 直接使用 "x * y" 会导致编译错误,因为它们可能为 null


if (x != null && y != null) {


// 在 Null 检测之后,x 与 y 会自动转换为非空值(non-nullable)


println(x * y)


}


else {


println("'arg2' is not a number")


}


}

类型检测和自动类型转换

我们可以使用 is 运算符检测一个表达式是否某类型的一个实例(类似于 Java 中的 instanceof 关键字)。 如果一个不可变的局部变量或属性已经判断出为某类型,那么检测后的分支中可以直接当作该类型使用,无需显式转换


示例:


//写法一


fun getStringLength(parm: Any): Int? {


if (parm is String) {


// 做过类型判断以后,"parm"会被系统自动转换为 String 类型


return parm.length


}


// 这里的 parm 仍然是 Any 类型的引用


return 0


}


//写法二


fun getStringLength(parm: Any): Int? {


if (parm !is String) return 0

评论

发布
暂无评论
Android Studio上Kotlin的入门,一次关于JVM的面试经历