val ->类似final申明
var ->正常申明一个属性
基本语法
// 定义函数
fun xxx(name:String){}
fun xxx(name:String) = name.length
fun largeNum(a:Int,b:Int)=max(a,b) //表示直接返回最大数
// if语法糖
var maxNum = if(a>b) a else b
fun largeNum(a:Int,b:Int) = if(a>b) a else b
//when语法 类似while
fun getScore(name:String) = when(name) {
"tom" -> 99
"jack" ->100
"tina" ->name.length/2
else -> 0
}
//when的类型判断
fun checkNumber(number:Number) = when(number){
is Int -> println("is int")
is Double -> println("is double")
else -> println("unknown")
}
//when其他用法
fun checkName(name:String) = when(name){
name.startsWith("tim") -> true
name == "sara" - > false
else -> false
}
//字符串或对象比较,不用使用equals
var o1 = "name"
var o2 = "name"
o1 == o2
//range用法
var range = 0..10 //区间[0,10]的整数
var range2 = 0 until 10 //区间[0,10)的整数(不包括10)
//for 循环用法
for(i in range){
println(i) // 0,1,2,3,...,10
}
for(i in range2){
println(i) // 0,1,2,3,...,9
}
for(i in range2 step 2){
println(i) //每次跳过两个 0,2,4,6,8 ,相当于i=i+2
}
for(i in 0 until 10 step 2){
printlin(i) // 0,2,4,6,8,
}
// downTo 降级
for(i in 10 downTo 1){
println(i) //10,9,8,7...,1
}
面向对象
// 成员参数的get set的一种写法,这里field只在当前get set有效
class Person1 {
var lastName: String = "zhang"
get() = field.toUpperCase()
set
var no: Int = 1
get() = field
set(value) {
if (value < 1)
field = 1
else
field = value
}
var height: Double = 1.23
private set
}
class Person2 constructor(var firstName: String) {
init {
firstName = "123"
}
}
//上面例子也可以简写成如下,如果构造器有注解,或者有可见度修饰符,这时constructor关键字是必须的,注解和修饰符要放在它之前。
class People(val firstName: String, val lastName: String) {
init {
//...
}
}
open class Person(var name: String, var age: Int) {
protected open fun eat() {
println("eat some food")
}
}
interface Study {
fun readBooks()
fun doHomeWork()
}
//Java在JDK 1.8之后也开始支持这个功能了,因此总体来说,Kotlin和Java在接口方面的功能仍然是一模一样的。
//为了让接口的功能更加灵活,Kotlin还增加了一个额外的功能:允许对接口中定义的函数进行默认实现。
interface Study2 {
fun readBooks()
fun doHomeWork() {
println("do homework default implementation")
}
}
class Student(var sno: String, var grade: Int, name: String, age: Int) : Person(name, age), Study2 {
override fun readBooks() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
// 在Study2接口中已经提供了默认的实现,可以不用再实现
// override fun doHomeWork() {
// TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
// }
override fun eat() {
}
}
数据类
这里的数据类型是指model相关的数据对象的类型
数据类java版
上面的代码可以由下面的kt代码代替
data class CellPhone(var brand: String, var price: Double)
fun useDataClass(){
var cell = CellPhone("XiaoMi", 199.0)
var cell2 = CellPhone("XiaoMi", 199.0)
val cellCopy = cell.copy()
println("cell1 equ cell2:${cell == cell2}") //true
}
单例
// 将class关键字替换成object即可实现单例
object SingleTon{
fun singletonTest(){
println("this is singletonTest")
}
}
常用内置函数
let函数
also函数
with函数
run函数
apply函数
- let函数
定义:一个作用域函数
作用:定义一个变量在一个特定作用域范围内,避免写一些null判断操作
应用场景:明确变量所处的特定作用域范围内可以使用,针对可null对象统一做判空处理
// it代替object对象去访问object的公有属性或方法
//表示object不为null的条件下,才会去执行let函数体
// 注:返回值 = 最后一行 / return的表达式
object?.let{
it.todo()
}
- also函数
类似let函数,返回值不一样,also的返回值=传入对象的本身
// also函数
var result = mVar.also {
it.function1()
it.function2()
it.function3()
999
}
- with函数
可以省去对象名,直接调用对象的公共属性或方法
//返回值 = 函数最后一行 / return表达式
with(object){
//...
}
- run函数
结合了let、with函数的作用
// 返回值 = 函数最后一行/return表达式
object.run{
// ...
}
people?.run{
//...
}
- apply函数
与run类似,区别于返回值,apply返回调用者本身