fun main(args:Array<String>){
println("Hello World")
println(SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date()));
}
通过这个HelloWorld可以看出Kotlin使用fun声明方法,而且可以推断语句分行结束,也可以使用Java的API,下面将详细学习Kotlin语法
基础语法:
变量与标识符
在Kotlin中所有的变量都是引用类型没有Java的基本数据类型了,Kotlin变量分为val(不可变类型)和var(可变类型) val 只读类型,仅能一次赋值,与Java中的final关键字相同, 尽量使用val可以带来可预测的行为和线程安全等特点。 var是可写的,在生命周期中可以被多次赋值 就会报错error can not be reassigned,从此图可以看出kotlin具有变量类型推断的能力,提供了不少方便 关键字与修饰符:
Kotiin 中的修饰符关键字主要分为 类修饰符、成员修饰符 访问权限修饰符、协变逆变修饰符、函数修饰符、属性修饰符、参数修饰符、具体化类型修饰符等
类修饰符
类修饰符 说明 abstract 抽象类 final 不可被继承final类 enum 枚举类 open 可继承open类 annotation 注解类 sealed 密封类 data 数据类
访问权限修饰符
访问权限修饰符 说明 private 私有,仅当前类可以访问 protected 当前类以及继承该类的可访问 public 默认值,对外可访问 internal 模块内可访问
属性修饰符
协变逆变修饰符
协变逆变修饰符 说明 in 消费者类型修饰符out T等价于?extends T out 生产者类型修饰符,in T等价于?super T
函数修饰符
函数修饰符 说明 tailrec 尾递归 operator 运算符重载函数 infix 中缀函数 inline 内联函数 external 外部函数 suspend 挂起协程函数
参数修饰符
参数修饰符 说明 vararg 变长参数修饰符 noinline 不内联函数修饰符 crossinline 限制Lambda表达式直接非局部return返回
具体化类型修饰符
流程控制语句:
* 分支语句(if,when)
* 循环语句(for, while)
* 跳转语句(return、break、continue、throw)
if表达式
if…else语句是控制程序流程的最基本的形式,其中else是可选的。在Kotlin中,if是一个表达式,即他会返回一个值(跟Scala一样)。代码示例如下: if的分支可以是代码块,最后的表达式作为该块的值: 例如:
var max = if(a>b){
a
}else{
b
}
if实现三元表达式:
when表达式:
类似于switch…case表达式,when会对所有的分支进行检查直到有一个条件可以被满足
var input = Scanner(System.`in`);
var obj = input.next();
when(obj){
// 0,1,2,4,5,6,7,8 -> println("${obj}=>这是一个数字");
"hello" -> println("${obj}==>这是hello")
else -> println("${pbj}===>Java中的default")
}
在when中也可以使用in和!in来检查一个值是否在一个区间和集合中:
fun fact(n:Int):Int{
var result = 1
when(n){
0, 1 -> result = 1;
else ->result = n*fact(n-1)
}
return result;
}
for循环:
for循环可以对任何提供迭代器(iterator)的对象进行遍历:
for(item in collection){
println(item);
}
for(i in array.indices){
println(array[i]);
}
或者
for((index, value) in array.withIndex()){
println($index, $value);
}
for(i in 1..10){
println(i);
}
或者
(1..10).forEach{
prineln(it);
}
fun sumFact(n:Int):Int {
var sum = 0;
for (i in 1.rangeTo(n)) {
sum += fact(i);
}
return sum;
}
while与dowhile和C语言和Java相同
fun sum(a: Int,b:Int):Int{
return a + b;
}
* 在Kotlin中可以使用函数字面量来获取函数的返回值
* 函数字面量:Kotlin中可以直接使用“=”符号返回一个函数的值
//在Kotlin中可以使用函数字面量来获取函数的返回值
fun sum(a:Int, b:Int) = a + b
//不一样的使用方式
val sumf = fun(a:Int,b:Int) = {a+b}
这时需要使用sumf(1,1).invoke()来获取返回值,因为此时为一个Lambda表达式
标签:
可以使用标签来控制return,break,continue语句的跳转到的位置
val intArray = inArrayOf(1, 2, 3, 4, 5)
intArray.forEach here@{//跳转到该处
if(it==3) return@here
println(it);
}
throw表达式
Kotlin中throw是表达式,他的类型是特殊类型Nothing, 类似与void
一般使用Nothing来标记无返回的函数 如果把一个throw表达式的值赋值给一个变量,需要显示声明类型为Nothing
val ex:Nothing = throw Exception("nothing")