Kotlin 类中的属性,既可使用关键字 var 声明为可变的,也能够用 val 声明为只能赋值一次的只读变量。node
/**
*只读变量
*/
val a: Int = 1 //当即赋值
val b = 30 //自动推断出 Int 类型
val c = "hello" //自动推断出 String 类型
/**
*可变变量
*/
var name: String = "keven" //当即赋值
var age: Int = 18 //当即赋值
var address: String = "北京" //当即赋值
复制代码
Kotlin 中使用关键字 class 声明类编程
class Person {
}
复制代码
在 Kotlin 中的一个类能够有一个主构造函数以及一个或多个次构造函数。主构造函数是类头的一部分:它跟在类名(与可选的类型参数)后。安全
class Person constructor(firstName: String) {
}
复制代码
若是主构造函数没有任何注解或者可见性修饰符,能够省略这个 constructor 关键字。bash
class Person(firstName: String) {
}
复制代码
也能够在类中定义次构造函数编程语言
class Person {
//定义一些可变变量
var name: String = "keven"
var age: Int = 18
var address: String = "北京"
//定义带参数构造函数
constructor(name: String, age: Int, address: String) {
this.name = name
this.age = age
this.address = address
}
//无参构造函数
constructor()
}
复制代码
使用 Person 类函数
//Kotlin 中没有 new 关键字
var result = Person() //使用无参构造函数
result.name = "KEVEN" //给变量赋值
result.age = 19
result.address = "上海"
//使用有参构造函数
var person=Person("Keven",20,"深圳")
复制代码
Kotlin 中的函数使用 fun 关键字声明学习
注意:若是一个函数不返回任何有用的值,它的返回类型是 Unit。Unit 是一种只有一个值 Unit 的类型。这个值不须要显式返回ui
//带有两个 Int 参数
//$a $b $c 表明引用 a、b、c 的值
fun printSum(a: Int, b: Int) {
var c=a+b
println("sum of $a and $b is $c")
}
复制代码
//带有两个 Int 类型参数,返回值为 Int 类型
fun Sum(a: Int, b: Int): Int {
return a + b
}
复制代码
将表达式做为函数体,返回值类型自动推断的函数this
fun sum(a: Int, b: Int) = a + b
复制代码
//其中 Boolean 类型参数 isMale 默认值为 true
//其中 Char 类型参数 short 默认值为 'a'
fun reformat(name: String, isMale: Boolean = true, short: Char = 'a') {
}
//调用有默认值参数的函数时,可不传有默认值的参数
reformat("CUE")
//固然也能够全传递
reformat("CUE",true,'C')
复制代码
函数的参数(一般是最后一个)能够用 vararg 修饰符标记spa
//使用 vararg 进行参数修饰
fun asList(vararg list: Int) {
for (a in list)
println("a = $a")
}
复制代码
对于可变参数函数进行调用
//传入任意个数 Int 类型参数
asList(1, 2, 3, 4)
asList(0, 1, 2)
复制代码
字符串能够包含模板表达式 ,即一些小段代码,会求值并把结果合并到字符串中。 模板表达式以美圆符($)开头,由一个简单的名字构成:
val i = 10
println("i = $i") // 输出“i = 10”
复制代码
或者用花括号括起来的任意表达式:
val s = "abc"
println("$s.length is ${s.length}") // 输出“abc.length is 3”
复制代码
原始字符串与转义字符串内部都支持模板。 若是你须要在原始字符串中表示字面值 $ 字符(它不支持反斜杠转义),你能够用下列语法:
val price = """${'$'}9.99"""
println(price)//输出“$9.99”
复制代码
在 Kotlin 中,if 是一个表达式,即它会返回一个值。 所以就不须要三元运算符(条件 ? 而后 : 不然),由于普通的 if 就能胜任这个角色。
// 传统用法
var max = a
if (a < b) max = b
// With else
var max: Int
if (a > b) {
max = a
} else {
max = b
}
// 做为表达式
val max = if (a > b) a else b
复制代码
if 的分支能够是代码块,最后的表达式做为该块的值
//输出 a、b 中较大的一项
var a = 1
var b = 2
val max = if (a > b) {
a
} else {
b
}
复制代码
许多编程语言(包括 Java)中最多见的陷阱之一,就是访问空引用的成员会致使空引用异常。在 Java 中,这等同于 NullPointerException 或简称 NPE。
Kotlin 的类型系统旨在从咱们的代码中消除 NullPointerException。
在 Kotlin 中,类型系统区分一个引用能够容纳 null (可空引用)仍是不能容纳(非空引用)。 例如,String 类型的常规变量不能容纳 null:
var a: String = "abc"
a = null // 编译错误
复制代码
若是要容许为空,咱们能够声明一个变量为可空字符串,写做 String?:
var b: String? = "abc"
b = null // ok
print(b)
复制代码
val b: String? = "Kotlin"
if (b != null && b.length > 0) {
print("String of length ${b.length}")
} else {
print("Empty string")
}
复制代码
这只适用于 b 是不可变的状况(即在检查和使用之间没有修改过的局部变量 ,或者不可覆盖而且有幕后字段的 val 成员),由于不然可能会发生在检查以后 b 又变为 null 的状况。
安全调用操做符,写做 ?.:
val a = "Kotlin"
val b: String? = null
println(b?.length)
println(a?.length) // 无需安全调用
复制代码
若是 b 非空,就返回 b.length,不然返回 null,这个表达式的类型是 Int?。
安全调用在链式调用中颇有用。例如,若是一个员工 Bob 可能会(或者不会)分配给一个部门, 而且可能有另一个员工是该部门的负责人,那么获取 Bob 所在部门负责人(若是有的话)的名字,咱们写做:
bob?.department?.head?.name
复制代码
若是任意一个属性(环节)为空,这个链式调用就会返回 null。
若是要只对非空值执行某个操做,安全调用操做符能够与 let 一块儿使用:
val listWithNulls: List<String?> = listOf("Kotlin", null)
for (item in listWithNulls) {
item?.let { println(it) } // 输出 Kotlin 并忽略 null
}
复制代码
安全调用也能够出如今赋值的左侧。这样,若是调用链中的任何一个接收者为空都会跳过赋值,而右侧的表达式根本不会求值:
// 若是 `person` 或者 `person.department` 其中之一为空,都不会调用该函数:
person?.department?.head = managersPool.getManager()
复制代码
判断若是 b 不为 null ,返回 b 的长度,不然返回 -1
val l: Int = if (b != null) b.length else -1
复制代码
除了完整的 if-表达式,这还能够经过 Elvis 操做符表达,写做 ?:
val l = b?.length ?: -1
复制代码
若是 ?: 左侧表达式非空,elvis 操做符就返回其左侧表达式,不然返回右侧表达式。 请注意,当且仅当左侧为空时,才会对右侧表达式求值。
请注意,由于 throw 和 return 在 Kotlin 中都是表达式,因此它们也能够用在 elvis 操做符右侧。这可能会很是方便,例如,检查函数参数:
fun foo(node: Node): String? {
val parent = node.getParent() ?: return null
val name = node.getName() ?: throw IllegalArgumentException("name expected")
// ……
}
复制代码
若是对象不是目标类型,那么常规类型转换可能会致使 ClassCastException。 另外一个选择是使用安全的类型转换,若是尝试转换不成功则返回 null
val aInt: Int? = a as? Int
复制代码
若是你有一个可空类型元素的集合,而且想要过滤非空元素,你可使用 filterNotNull 来实现
val nullableList: List<Int?> = listOf(1, 2, null, 4)
val intList: List<Int> = nullableList.filterNotNull()
复制代码
本小节就介绍到这里,下一小节咱们会继续学习 Kotlin 的基本语法。