## Kotlin学习笔记
---
## 数据基础
可**多次赋值**变量类型:**var** <标识符> : <类型> = <初始化值>
只能初始化**一次赋值**变量类型:**val** <标识符> : <类型> = <初始化值>
### 数据类型
- 基本数值类型:`Byte、Short、Int、Long、Float、Double`
- 常见数值表现形式:`0b00101011、12、12L、0x9A、12.3f、12.3e10`
- 字符:Char
### 数据类型转化
toByte()、 toShort()、toInt()、toLong()、toFloat()、toDouble()、toChar(): Char
### 数值运算
- 位运算
```
shl(bits) – 左移位 (Java’s <<)
shr(bits) – 右移位 (Java’s >>)
ushr(bits) – 无符号右移位 (Java’s >>>)
and(bits) – 与
or(bits) – 或
xor(bits) – 异或
inv() – 反向
```
- 逻辑
```
|| – 短路逻辑或
&& – 短路逻辑与
! - 逻辑非
```
### 数组
- 数组定义与使用
```
val a=arrayOf(1,2,3);//[1,2,3] 通过函数arrayOf创建
val b=Array(3,{i->(i*2)});//[0,2,4] 通过Array创建
val c:IntArray=intArrayOf(1,2,3);//[1,2,3] 通过具体类型的intArrayOf创建
```
### 字符串
- 基础字符串str的使用
```
方式1:str[0]='c';
方式2:for(c in str) println(c);
```
- 多行字符串
```
val text="""
字符串
字符串
"""
```
- 字符串模板
通俗来讲就是在字符串中间加入一段以$开头的表达式,运算结果加入到字符串中,很显然,s字符串的值为"a+b=3";为防止混淆,在字符串中如果需要使用$符号需要写成`${'$'}`
```
val a=1;
val b=2;
val s="a+b=${a+b}"
```
## 函数使用
### 函数
- 函数通过以下方式定义
> fun functionName(a:Int,b:Short):Int{
> return 0;
> }
- 定义与使用示例
```
fun calculate(a :Int,b :Int):Int{
return a + b;
}
fun main() {
println("Hello, world!!!"+calculate(3,4));
}
```
> 结果输出 `Hello, world!!!7`
### 简化函数
fun calculate(a:Int, b:Int):Int=a+b;
### Lambda表达式(匿名函数)
- 不太熟悉,后续用到再重新补充此部分。
fun main(args: Array<String>) {
val sumLambda: (Int, Int) -> Int = {x,y -> x+y}
println(sumLambda(1,2)) // 输出 3
}
### 参数
如上,普通函数直接写明类型即可;
- 可变长的参数
fun func(vararg v:Int){};通过这种形式传进的v是一个数组,但传参的时候不需要考虑func()函数接收的长度,直接func(1,2,3,4,5,6)调用。
### IF、WHEN、FOR的使用
- 常规(略)
- 区间使用,可在in关键字前加!表示不在区间内
if(i in 1..4)print(i);//输出i的值
for(i in 1..4)print(i);//输出1234
for(i in 1..4 step 2)print(i);//指定步长,输出13
for(i in 4 downTo 1 step 2)print(i);//逆向遍历区间,输出42
for(i in 1 until 4)print(i);//排除结尾元素,输出123
- 类型检测
if(obj is String){return obj.length;}
- when的使用(类似于switch)
```
when(a){
1-> print("hello1");
2,3-> print("hello3");
in 4..6 ->print("hello tom");
else->{
print("fuck")
}
}
```
- for 遍历数组names
` for(name in names)print(name);`
`for(i in names.indices)print("$i is ${names[i]}");`
第一个通过名字遍历,直接输出tom、bob等
第二个通过序号遍历,输出序号和对应位置的值:1 is tom、2 is bob等
- 标签使用,break或continue后接标签可以直接结束循环回到标签处,执行下一步
```
testBiaoQian for(){
for(){
break@testBiaoQian
}}
```
## 几点需要注意的
### Null处理
var a:int?=1; //定义时类型后加?说明数据可为空
var b:a!!.toInt();//对可能为空的情况后面加!!表示抛出异常
## 类的使用
### 基本
- 定义类
class AClass{}
- 定义属性和成员函数
class AClass{
var a:Int =0;
fun foo(){print("hello");}
}
-使用类
val aclass=AClass();
val b:Int =aclass.a
aclass.foo();
示例
```
class Person {
var lastName: String = "zhang"
get() = field.toUpperCase() // 将变量赋值后转换为大写
set
var no: Int = 100
get() = field // 后端变量
set(value) {
if (value < 10) { // 如果传入的值小于 10 返回该值
field = value
} else {
field = -1 // 如果传入的值大于等于 10 返回 -1
}
}
var heiht: Float = 145.4f
private set
}
// 测试
fun main(args: Array<String>) {
var person: Person = Person()
person.lastName = "wang"
println("lastName:${person.lastName}")
person.no = 9
println("no:${person.no}")
person.no = 20
println("no:${person.no}")
}
```
### 深入
#### 待补充
网友评论