2017年的Google I/O的大会上宣布一个重磅消息,就是Android开发支持Kotlin。
虽然现在国内的Android开发用Kotlin的不会很多,但是肯定要学一下,预防万一的。
如果之前学过java的,并且java基础比较可以的。再来学Kotlin,那可以说是非常简单的。因为java跟Kotlin还是挺多地方相似的,只是Kotlin比java简化非常多。
这里只会列出大部分Kotlin相比java比较特别的地方,就简单的写一些Demo演示一下。这里不适合没有编程语言基础的学习的。
先列出来Kotlin的关键字,了解一番:
Kotlin的关键字
- var:定义变量
- val:定义常量
- fun:定义方法
- Unit:默认方法返回值,类似于Java中的void,可以理解成返回没什么用的值
- vararg:可变参数
- $:字符串模板(取值)
- 位运算符:or(按位或),and(按位与),shl(有符号左移),shr(有符号右移),ushr(无符号右移),xor(按位异或),inv(按位取反)
- in:在某个范围中 检查值是否在或不在(in/!in)范围内或集合中
- downTo:递减,循环时可用,每次减1
- step:步长,循环时可用,设置每次循环的增加或减少的量
- when:Kotlin中增强版的switch,可以匹配值,范围,类型与参数
- is:判断类型用,类似于Java中的instanceof()is运算符检查表达式是否是类型的实例。
如果一个不可变的局部变量或属性是指定类型,则不需要显式转换 - private //仅在同一个文件中可见
- protected //同一个文件中或子类可见
- public //所有调用的地方都可见
- internal //同一个模块中可见
- abstract //抽象类标示
- final //标示类不可继承,默认属性
- enum //标示类为枚举
- open //类可继承,类默认是final的
- annotation //注解类
- init //主构造函数不能包含任何的代码。初始化的代码可以放到以 init 关键字作为前缀的初始化块(initializer
blocks)中 - field //field 标识符只能用在属性的访问器内。特别注意的是,get set方法中只能能使用filed
绝对的。属性访问器就是get set方法。洋气的名字。关于这个我会在后面详细说明 - ://用于类的继承,变量的定义
- .. //范围操作符(递增的) 1..5 2..6 千万不要6..2
- :://作用域限定符,kotlin这个和c语言一样。这个我个人觉得在kotlin中还是很少见的。
- inner //类可以标记为 inner {: .keyword } 以便能够访问外部类的成员。内部类会带有一个对外部类的对象的引用
- object//对象声明 并且它总是在 object{: .keyword }
关键字后跟一个名称。对象表达式:在要创建一个继承自某个(或某些)类型的匿名类的对象会用到 - it //单个参数的隐式名称 如果函数字面值只有一个参数,那么它的声明可以省略(连同 ->),其名称是 it。
- inline //修饰符影响函数本身和传给它的 lambda 表达式:所有这些都将内联
接下来直接演示Demo,配置编辑环境和编辑器,网上一找一大堆,这里就不一一说明了。
一、变量的取值范围
fun main(args: Array<String>) {
val aByte: Byte = Byte.MAX_VALUE
val bByte: Byte = Byte.MIN_VALUE
println("Byte的最大值:" + aByte)
println("Byte的最小值:" + bByte)
val aShort: Short = Short.MAX_VALUE
val bShort: Short = Short.MIN_VALUE
println("Short的最大值:" + aShort)
println("Short的最小值:" + bShort)
val aInt: Int = Int.MAX_VALUE
val bInt: Int = Int.MIN_VALUE
println("Int的最大值:" + aInt)
println("Int的最小值:" + bInt)
val aLong: Long = Long.MAX_VALUE
val bLong: Long = Long.MIN_VALUE
println("Long的最大值:" + aLong)
println("Long的最小值:" + bLong)
var str1 = "Layne"
var str2 = "layne"
//第二个参数为布尔值,false代表不忽略字母的大小写,true则表示忽略
println(str1.equals(str2, false))
println(str1.equals(str2, true))
}
运行结果:
二、函数的演示
//普通有参数和返回值的函数
fun sayHello(name: String): String {
return "hello " + name;
}
//参数可以为空的函数
fun sayHelloOne(name: String?): String {
return "hello " + name;
}
fun diaryGenerater(placeName: String): String {
var temple = "您传入的是:${placeName},${placeName}有${placeName.length}个字的长度!";
return temple;
}
//when表达式的用法,类似java的Switch
fun gradeStudent(score: Int) {
when (score) {
10 -> println("满分,很棒")
9 -> println("干得不错")
8 -> println("还可以")
7 -> println("还需努力")
6 -> println("刚好及格")
else -> println("需要好好加油")
}
}
//简化的函数
fun add(x: Int, y: Int): Int = x + y
fun main(args: Array<String>) {
println(sayHello("layne"))
println(sayHelloOne(null))
println(diaryGenerater("layne"))
gradeStudent(10)
println("简化的函数" + add(4, 5))
var i = { x: Int, y: Int -> x + y }
println("函数表达式1:" + i(5, 5))
var j: (Int, Int) -> Int = { x, y -> x + y }
println("函数表达式2:" + j(6, 5))
}
运行结果:
三、变量类型的转换
fun main(args: Array<String>) {
var a = "20"
var b = 10
var c = "30"
//数字装换成字符串
a = b.toString()
println(a)
//字符串转换成数字
b = c.toInt()
println(b)
//i = "a20"编译虽然没有问题,但是运行时有问题的
//顺带在这里说明一下异常处理,和java类似
var i = "a20"
var j = 10
try {
j = i.toInt()
} catch(e: Exception) {
println("不好意思,该字符串不能转换成数字")
}
}
运行结果:
四、人机交互的演示
fun main(args: Array<String>) {
println("请输入第一个数字:")
var num1str = readLine()
println("请输入第二个数字:")
var num2str = readLine()
var num1:Int = num1str!!.toInt()
var num2:Int = num2str!!.toInt()
println("$num1 + $num2 = ${num1+num2}")
}
运行结果:
五、开区间和闭区间的演示
/*
开区间和闭区间
开区间用(a,b)来表示
闭区间用[a,b]来表示
闭区间包括了两个端点a和b
而开区间不包括两个端点a和b
*/
fun main(args: Array<String>) {
println("闭区间的使用:")
var nums = 1..10 // [1,10]
for(num in nums){
print("${num},")
}
println("")
println("====================")
println("开闭区间的使用:")
var nums1 = 1 until 10 // [1,10)
for(num in nums1){
print("${num},")
}
println("")
println("====================")
println("step的使用:")
var nums2 = 1 .. 20
for(num in nums2 step 2){
print("${num},")
}
println("")
println("====================")
println("reversed()的倒叙使用:")
var num3 = nums2.reversed()
for(num in num3 ){
print("${num},")
}
println("")
println("====================")
println("总数为:"+num3.count())
}
运行结果:
六、list和map集合的演示
//list和map集合的简单使用
fun listTest() {
var lists = listOf("kotlin", "java", "python", "php", "c", "c++")
for ((i, e) in lists.withIndex()) {
println("$i -> $e")
}
}
fun mapTest() {
var map = TreeMap<String, String>()
map["stu1"] = "Layne1";
map["stu2"] = "Layne2";
map["stu3"] = "Layne3";
map["stu4"] = "Layne4";
map["stu5"] = "Layne5";
println("$map")
}
fun main(args: Array<String>) {
listTest()
println("=================")
mapTest()
}
运行结果:
七、默认参数和具名参数的演示
//声明一个常量PI
val PI = 3.14159f
//计算长方形面积:长*宽
fun getRectArea(long: Float, wide: Float): Float {
return long * wide;
}
//计算圆的周长:2*π*半径(使用默认参数)
fun getRoundGirth(Pi: Float = PI, radius: Float): Float {
return 2 * Pi * radius;
}
//计算圆的周长:π*直径(使用默认参数)
fun getRoundGirth2(Pi: Float = PI, diameter: Float): Float {
return Pi * diameter;
}
//计算圆的体积:π*半径*半径*高(使用默认参数)
fun getRoundVolume(Pi: Float = PI, radius: Float, high: Float): Float {
return Pi * radius * radius * high
}
//计算球体的表面积:π*半径*半径*4(使用默认参数)
fun getGlobeArea(Pi: Float = PI, radius: Float): Float {
return Pi * radius * radius * 4;
}
fun main(args: Array<String>) {
println("长方形面积:"+getRectArea(3f,4f))
println("圆的周长:"+getRoundGirth(radius = 4f))//具名参数
println("圆的周长:"+getRoundGirth2(diameter = 8f))//具名参数
println("圆的体积:"+getRoundVolume(radius = 4f,high = 5f))//具名参数
println("球体的表面积:"+getGlobeArea(radius = 4f))//具名参数
}
运行结果: