入门的东西很少,没有必要去看视频,看一下文章一下午也就解决了
1、首先是变量的声明
两个关键字:var(变量) val(常量)
基本数据类型:Int, Short, Double,Long,Float,String
var a:Int =2
var b:String ="3"
当然Kotlin有一个比较牛逼的功能:智能类型推断。
var a=2
var b="3"
系统自动默认a为整形,b为字符串,b=a会报错
2、函数的声明
关键字:fun
fun function1(){}
fun function2(var a:Int,var b:Int):Int{
return a+b }
var function3={a:Int,b:Int->a+b}
var function4:(Int,Int)->Int={a,b->a+b}
调用function3和function4时和调用function2是一样的,function3(1,2)即可
3、类的声明
关键字:class ,object,enum,interface
class Son{}//没有参数
class Son(var a:Int,var b:Int){var c:Int =2}//参数可以直接在类名后面的括号里声明,也可以在类体里面声明
object Son{} //object声明的事单例的类
enum Son{"a","b"}//枚举
interface Son{ fun eat()}//接口
4、字符串模版
fun stringCopy(placeName:String){
var diary=""" 今天去${placeName}游玩 """
}
关键词${}将想要替换字符串的东西放进大括号里就可以了,三个引号和一个引号暂时没有看出区别
5、字符串比较
var a="AAA" var b="aaa"
a.equals(b)
a.equals(b,true)//第二个参数是指是否忽略大小写的差别,默认为false
6、kotlin的空值处理
var numStr=readLine()
var num=numStr.toInt()//会报错,因为numStr可能是空,在numStr!!.toInt() !!表示保证不为空
var num=numStr?.toInt()//不会报错,但是在操作该num运算的时候会报错
fun obtainNum(var numStr?:String){}//?表示该参数不可以为空
7、when表达式(和java的switch很相似)
when(num){
1->println("1")
2->println("2")
else->println("3")
}
when方法里必须有else
8、循环和区间
//循环和区间 fun main(args: Array) { var nums=1..100//1到100 for (num in nums)//关键字in println(num) for (num in nums step 5)//间隔打印 println(num) var nums2=nums.reversed()//倒序排列 for (num in nums2) println(num) var nums3=1 until 20//前闭后开区间 for (num in nums3) println(num) }
9、List和Map
var list=listof()
for((i,e) in list.withIndex())
println("$i $e")//打印出下标和内容,还有各种顺序的打印不一一说明
var map=TreeMap
map["a"]="AAA"
map["b"]="BBB"
println(map["a"])
10、异常处理(和java区别不大)
使用try{}catch(e:Exception){}
也可以使用throw
11、递归和尾递归优化
fun fact(num: Int): Int {//递归 if (num == 1) { return 1 } else { return num * fact(num - 1) } } /** * *尾递归优化,递归次数过大时,计算机会自动停止执行,并报错, *尾递归要求:1、递归调用的函数必须是函数本身 *关键字 tailrec */ tailrec fun ollAdd(num: Int, result: Int): Int { if (num == 0) { return result } else { return ollAdd(num - 1, result + num) } }
12、继承和印章类
关键字:abstruct(有抽象方法的类必须也用abstruct修饰)
open class A(var name:String){
open fun eat(){} }
B是A的父类,则写成:class A :B{} A类需要用open修饰才能被继承,其中可以背重写的方法也要用open修饰
若有参数的继承,则写成:class A(name:String):B(name){}
/** * 印章类就是子类的种类是有限多个 * 关键字sealed ,在class之前 * 类中要指定印章类的子类 * 印章类没有构造函数,因此不能直接被实例化,只能通过其子类来实例化,如:var s1:Son=Son()会报错,var s1:Son=Son.GrandSon() */ sealed class Son{ class GrandDaughter:Son() class GrandSon:Son() }
fun main(args: Array) { var s1:Son=Son.GrandDaughter() var s2:Son =Son.GrandSon() }
13、代理和委托
/** * 代理表现在执行此A类方法时调用的却是B类的方法,但是A和B必须实现了相同的接口 * 只需要在A类实现接口语句后面添加 by B(),如A和B都实现了C接口,则如下:class A : C by B(){} * 单例表示运行空间里最多只有一个此类的实例,比如B类,则只需要在B类声明的时候将class关键字修改成object即可,在其实例化的时候不要带括号 * 如:object B :C{} class A : C by B {}即可 */ fun main(args: Array) { var father=XiaotouFather() father.eat() }