最近报了一个“大创”[1]项目,需要开发一个app,所以有了学习Android程序开发的必要,自己的话也是很早就想学了,但一直懒,耽误了。
一、变量和函数
每门语言的基础都是其变量与函数。Kotlin的变量类型和其它语言基本一致,有Int,String,Long等。但与其它诸如C、Java语言不同的是,Kotlin完全抛弃了基本变量类型,也就是说这里的Int、Long等都是类,这也是它们首字母大写的原因。
与Java的另一个不同则是,Kotlin再申明变量时并不需要显式地指明变量的类型,只需要采用val/var来说明变量是可改变/不可改变的即可。
fun main(){
val a=10
var b:Int=10
b=b+10
println("a="+a+" b+10="+b)
}
a=10 b+10=20
上述代码又引出了函数和输出的概念。Kotlin的函数采用关键字fun来定义,而输出则是println函数。
fun lagerNumber(Num1:Int,Num2:Int):Int{
if (Num1>=Num2){
return Num1
}
else{
return Num2
}
}
上面就是一个函数的标准写法例子,参数按参数名:参数类型传递,如果函数有返回值则采用函数名:类型名来指定。
二、条件语句
Kotlin有两种类型的条件语句:if和when。
1、if
Kotlin的if语句和其他语言的基本一致,但它可以存在返回值--最后执行的语句的值。例如上面的函数可以写成
fun lagerNumber(Num1:Int,Num2:Int):Int{
return if (Num1>=Num2)Num1 else Num2
}
且这个函数还可以简化为
fun lagerNumber(Num1:Int,Num2:Int)=if (Num1>=Num2)Num1 else Num2
这是因为Kotlin里函数可以采用=来直接赋值,而且由于后面返回的值一定是Int,所以Kotlin可以智能判断函数返回值的类型,所以不需要指明返回值类型。
2、when
when其实有点像C语言里的switch语句,但它远比switch语句强大。
fun getScore(name:String):Int{
when(name){
"John"->97
"Peter"->99
"Mark"->88
"Jack"->89
"Ketty"->94
else->85
}
}
fun main(){
getScore("Ketty")
}
94
when与switch不同,它不需要加break,完成一个条件后会自动跳出。且when还可以判断是否属于一个类
fun Judge(number:Number){
when(number){
is Int->println("Int")
is Long->println("Long")
else->println("unknown")
}
}
fun main(){
val a=12L
Judge(a)
}
Long
Number是一个大类,Int、Long、Double都是它的子类。
三、类
作为面向对象编程的关键,Kotlin怎么能少得了类呢。
1、类的申明
Kotlin采用关键字class来申明类
open class Person(val name:String,val age:Int){
fun eat(){
println("$name is eating")
}
}
这就定义了一个名为Person[2]的类。
open:代表该类可以被继承,否则默认是不可继承的。
括号里的参数是主构造函数,代表构造两个变量分别名为name和age,且以传进来的值进行初始化。
类里面是定义的函数,所有继承了该类的子类都会有该类的所有特征。
fun main(){
val p=Person("Jack",12)
println("${p.name} is ${p.age} years old")
p.eat()
}
Jack is 12 years old
Jack is eating
这里的${}
是Kotlin字符串里内嵌输出表达式的方法,如果是单个变量还可以省略{}
。
2、类的继承
继承就是指新建一个类但这个类并不是从头开始建,而是通过继承某些类的特征,再添加自己的特征。比如现在要新建一个名为Student的类,该类肯定符合Person的特征,所以可以继承Person的特征。
class Student(val sno:String,val grade:Int,name:String,age:Int):Person(name,age){
init{
println("sno is $sno")
println("grade is $grade")
}
}
这里定义了一个从Person继承的子类Student。
继承关系通过Person前的冒号':'表示
类里面的init表示主构造函数,也即创建该类时一定要执行的语句。
Student中的name,age变量不需要为其申明val或者var,因为它们是由父类所决定的
fun main(){
val s=Student("SA1234",1,"Jack",12)
s.eat()
}
sno is SA1234
grade is 1
Jack is eating
3、函数形参的默认值
函数所传递的参数都是可以设置默认值的,只需要直接再定义的时候就赋值即可。
fun person(val name:String="Jack",val age:Int){
println("$name is eating")
}
如上,Person函数的name变量的默认值就设为了Jack,故你可以不传递这个参数而执行person函数,它的name值就为Jack。
四、接口
Kotlin是单继承语言,也就是一个类最多只能继承一个父类,但可以实现任意多个接口。
接口采用关键字interface
定义
interface Study{
fun readBooks()
fun doHomework()
}
接口就是一群抽象函数的集合,如果一个类继承了接口,就要实现该接口里定义的抽象函数。
class Student(name:String,age:Int):Person(name,age),Study{
override fun readBooks(){
println("$name is reading")
}
override fun doHomework(){
println("$name is doing homework")
}
}
这里的Student就继承了Person和Study。
关键字override用于重写接口里的函数,也可以来重写父类里的函数,同时接口里的函数允许默认实现
fun main(){
val s=Student(age=12,name="Jack")
s.readBooks()
}
Jack is reading
这里有一种新的参数传递方式,采用一一对应的方式,即可按照原函数或类的固有顺序。
五、集合
集合大致可分为三类:List,Set和Map。
三种集合的创建方法都非常相似,以List为例
fun main(){
val list=listOf("Apple","Banana","Pear")
for (i in list){
println(i)
}
}
Apple
Banana
Pear
lisOf是kotlin的一个内置函数,用于初始化list。set和map对应的则是setOf和mapOf。但需要注意的是这样创建的集合是无法修改的,因为kotlin默认创建的变量会无法修改(必须要修改的除外)。若想创建可以修改的集合要对应换成mutableListOf()等
对map要特殊一点,其它两种要添加新量只需使用*fruit.add()*式的函数。而map,则只需直接添加,如
fun main(){
var map=mutableListOf("Apple" to 1,"Banana" to 2,"Pear" to 3)
map["Peach"]=4
for((fruit,number) in map){
println("$fruit is $number")
}
}
Apple is 1
Banana is 2
Pear is 3
Peach is 4
Ps:Set与List的具体区别见Set与List
六、Lambda编程
Lambda的基本语法结构为:
val maxLengthFruit=list.maxBy({fruit:String->fruit.length})
这就是一个Lambda编程的例子。list是一个列表,而maxBy方法是将list里得元素一个个取出来,带入Lambda表达式中,再比较大小,取出最大者。
在最后附上官方文档和网页程序运行端