Kotlin入门——Kotlin学习笔记
- 一、基本数据类型
- 1. 变量
- 2. 数字类型的自动推断
- 3. kotlin中的区间
- 4. 数组相关
- 5. 字符串与字符串模板
- 二、控制流
- 三、返回跳转与标签
- 四、类与对象
- 1. 构造函数
- 2. 继承
- 3. 可见性
- 4. 扩展函数
本博客仅供参考,有关kotlin基础语法的学习在官网有很详细的中文参考文档,附上链接传送门:
一、基本数据类型
1. 变量
val:只读
var:可变
2. 数字类型的自动推断
所有以未超出Int最大值的整型值初始化的变量都会推断为Int类型。如果初始值超过了Int其最大值,那么推断为Long类型;
对于以小数初始化的变量,编译器会推断为Double类型。 如需将一个值显式指定为Float类型,请添加后缀f或F;
3. kotlin中的区间
1 . . 10 表示 [1,10]
i in 1 until 10 表示 [1,10)
4. 数组相关
若要创建数组[1, 2, 3]
(1)arrayOf(1, 2, 3)
(2)Array(3){ i->i}
5. 字符串与字符串模板
原始字符串:
用""" “”“来表示原始字符串,可将字符串的空格与分行直接体现出来
“”“字符串1
字符串2
“””
字符串模板:
可以用来对变量、表达式进行求值
val a=1
println "a = $a"//输出 a = 1
val str="abc"
println("$str.length = ${str.length}")//输出 abc.length = 3
二、控制流
1. if表达式
if语句可以用作表达式,这种情况if必须有else分支,否则报错
val max = if (a > b) {
print("Choose a")
a
} else {
print("Choose b")
b
}
2. when表达式
当x的值满足某个分支时,执行该分支的代码
when (x) {
0, 1 -> print("x == 0 or x == 1")
else -> print("otherwise")
}
分支还可以判断 是/不是(is/ ! is)某个特定类型
fun hasPrefix(x: Any) = when(x) {//判断输入参数是不是包含prefix前缀的字符串
is String -> x.startsWith("prefix")
else -> false
}
3. for表达式
for (i in 1..3) {//在某个范围进行迭代
println(i)
}
for (i in 6 downTo 0 step 2) {//以步进值为2进行逆向迭代
println(i)
}
//遍历数组的方法
for (i in array.indices) {
println(array[i])
}
for ((index, value) in array.withIndex()) {
println("the element at $index is $value")
}
4. while表达式
while(...){
...
}
do{
...
}while(...)
三、返回跳转与标签
fun foo() {
listOf(1, 2, 3, 4, 5).forEach {
if (it == 3) return@forEach // 局部返回到该 lambda 表达式的调用者,即 forEach 循环
print(it)
}
print(" done with implicit label")
}
如果不加标签,上面的代码return时会直接返回到最外层的foo函数
四、类与对象
1. 构造函数
主构造函数
//主构造函数(显式)
class Person private constructor(firstName: String) { /*……*/ }
//主构造函数(隐式)
class Person(firstName: String) { /*……*/ }
次构造函数
class Person {
...
constructor(parent: Person) {
...
}
}
如果类有一个主构造函数,每个次构造函数需要委托给主构造函数, 可以直接委托或者通过别的次构造函数间接委托。委托到同一个类的另一个构造函数用关键字this即可
class Person(val name: String) {
...
constructor(name: String, parent: Person) : this(name) {
...
}
}
在类中可以用init代码块执行初始化语句,所有初始化块与属性初始化器中的代码都会在次构造函数体之前执行。
2. 继承
Kotlin 中所有类都有一个共同的超类Any,该类有三个方法: equals() 、 hashCode() 与 toString()。
默认情况下,Kotlin类是不可变的,它们不能被继承。如果要使一个类可继承,需要用open关键字标记。Kotlin对于可覆盖的成员以及覆盖后的成员都需要显式修饰符标记,open标记可覆盖成员,override标记覆盖后的成员,若想禁止再被子类覆盖,可用final关键字进行标记。
另外,var属性可以覆盖一个val属性。
3. 可见性
对应类内部声明的成员
private —— 类内部可见;
protected —— 类内部 / 子类可见;
internal —— 能见到类声明的模块内可见;
public —— 能见到类声明的都可见。
4. 扩展函数
扩展函数的格式如下所示:
fun 被扩展类名.扩展函数名( 参数 ){
//实现代码
...
}
扩展是静态解析的,即扩展函数的调用取决于声明的类型,而不是实际运行时的类型。
fun main() {
open class Shape
class Rectangle: Shape() //Rectangle类继承自Shape类
fun Shape.getName() = "Shape"
fun Rectangle.getName() = "Rectangle"
fun printClassName(s: Shape) {
println(s.getName())
}
//下面这句虽然传入的类型为Rectangle,但是参数声明时的类型为Shape,所以输出为Shape
printClassName(Rectangle())
}
当成员函数与扩展函数的声明完全相同时,总是调用成员函数。
扩展函数支持重载。