2017年谷歌 I/O 全球开发者大会正式宣布,kotlin被列为Android开发的一级语言。由捷克JetBrain公司位于俄罗斯圣彼得堡团队所研发所创。其语法最大的特点是简洁,和java,C++一样都是属于静态语言。运行原理如下图所示,列举java的和kotlin的参照理解:
众所周知,java虚拟机的目的便是跨平台运行,下载的jdk,jre便包含了java虚拟机,底层在操作系统之上多了虚拟机这个环节,便将操作系统之间架构的不同给屏蔽了,不必考虑这些就能在不同系统运行java程序,kotlin和java同理,都是先编译成字节码文件再链接成机器语言,只不过链接的那一步多了kotlin的运行时库。
========================================
基本上语法和Java很像,下面列出来整理的不同点:
没有New:
kotlin里没有new这个关键字,需要的地方直接构造就行了。
标识符:
kotlin在命名的标识符方面,除了&不能参与命名,其他和java都一样。
变量常量:
var: 可变变量
val: 不可变变量(只能被一次赋值的变量,类似java 的final常量) (比如代码中http协议的回执中,获得到数值之后赋给val 类型声明的变量,这就叫运行期)。
const val : 编译器常量(编译结束的时候,写啥就是啥了不能再改了,类似C++的宏定义),只能用于String或者基本数据类型,是顶层常量(写在类之外的,不属于任何一个类)。
函数定义:
函数定义使用关键字 fun,参数格式跟java不同,后缀格式,为:参数 : 类型
fun sum(a: Int, b: Int): Int { // Int 参数,返回值 Int
return a + b
}
如果没有返回值,默认是UInt
基本数据类型:
kotlin的基本数据类型可以理解成Java基本数据类型的首字母大写,而且没有像Java那样的基本数据类型包装类(int --> integer),每种基本数据类型都能用如下方法进行转化,但是像java那样用加号的形式从数字转字符串的方法,在kotlin就不好用了,但是字符串之间的拼接,依然可以用“+”:
toByte(): Byte
toShort(): Short
toInt(): Int
toLong(): Long
toFloat(): Float
toDouble(): Double
toChar(): Char
字符串模版:
$便是字符串模版的应用,直接在字符串中塞进“$变量名”表示此处引用该变量的值,java的话多用字符串拼接处理出目标字符串,有了字符串模版倒是方便了。举例子:
fun main(args:Array)
{
val s = "runoob"
val str = "$s.length is ${s.length}" // 求值结果为 "runoob.length is 6"
println(str)
}
NULL检查机制:
类型后面加 ? 说明数值可以被赋null
运算符:
===是引用的比较,比较的是引用的值是否相同,即栈中所存储的 堆中的内存地址是否相同。
表达式:
表达式没什么特殊的,就是可以做为一个变量放到等号的右边进行赋值操作,如:
// 传统写法
var max: Int
if (a > b) {
max = a
} else {
max = b
}
// 作为表达式
val max = if (a > b) a else b
由此可见表达式代码数量变得简洁。
函数体表达式(lamda):
匿名函数,经常作为赋值在等号右边,或者是参数使用
1. 无参数的情况 : val/var 变量名 = { 操作的代码 }
2. 有参数的情况 val/var 变量名 : (参数的类型,参数类型,...) -> 返回值类型 = {参数1,参数2,... -> 操作参数的代码 } 可等价于 // 此种写法:即表达式的返回值类型会根据操作的代码自推导出来。 val/var 变量名 = { 参数1 : 类型,参数2 : 类型, ... -> 操作参数的代码 }
3. lambda表达式作为函数中的参数的时候,这里举一个例子: fun test(a : Int, 参数名 : (参数1 : 类型,参数2 : 类型, ... ) -> 表达式返回类型){ ... }。
区间:
使用 in 运算符来检测某个数字是否在指定区间内
fun main(args: Array) {
val x = 5
val y = 9
if (x in 1..8) {
println("x 在区间内")
}
}
继承:
如果一个类要被继承,可以用open进行修饰
扩展:
Kotlin 可以对一个类的属性和方法进行扩展,扩展函数可以在已有类中添加新的方法,不会对原类做修改,扩展函数定义形式:
fun receiverType.functionName(params){
body
}
以下实例扩展 User 类 :
class User(var name:String)
/**扩展函数**/
fun User.Print(){
print("用户名 $name")
}
fun main(arg:Array){
var user = User("Runoob")
user.Print()
}
Getter & Setter:
kotlin 在bean中直接写属性就行了,不用写getter 和setter