介绍一下基本的Kotlin语法
简介:
- Kotlin编译后生成JVM可以运行的class文件,因此和Java兼容性高。
变量和函数
- val:常量。var:变量。
var a : Int = 1
// 函数
// 标准版本
fun method0 (param1: Int, param2: Int): Int {
return param1 + param2
}
// 只有一行代码,简化1,直接=结果
fun method1 (param1: Int, param2: Int) : Int = param1 + param2
// 只有一行代码,简化2,省略返回类型
fun method2 (param1: Int, param2: Int) = param1 + param2
逻辑控制
// if语句(可以有返回值,类似于 ? : 功能了)
fun method(num1: Int, num2: Int): Int {
var value = 0
if (num1 > num2) value = num1
else value = num2
return value
}
fun method1(num1: Int, num2: Int): Int {
val value = if (num1 > num2) num1
else num2
return value
}
fun method2(num1: Int, num2: Int) = if (num1 > num2) num1 else num2
// when语句
fun getScore(name: String) = if(name == "Tom") {
86
} else if(name == "Tommy") {
66
} else {
0
}
fun getScore1(name: String) = when(name) {
"Tom" -> 86
"Tommy" -> 66
else -> 0
}
/*
匹配值-> {执行逻辑}
*/
// Number 是 Int Float等数字相关的类的父类
fun checkNumber(num: Number) {
when(num) {
is Int -> { println("number is Int") }
is Double -> println("number is Double")
else -> println("number not support")
}
}
// when也可以不带参数
fun getScored1(name: String) = when {
name.startsWith("tom") -> 86
name == "Bob" -> 66
else -> 0
}
// 循环:while循环一摸一样,for循环较为不同
fun main() {
val range = 0..10 // 代表从0到10的闭区间,..代表左闭右闭
val range1 = 0 until 10 // [0, 10) until是左闭右开
val range2 = 0 until 10 step 2 // 每次跨度2,也就是0,2,4,6,8
val range3 = 10 downTo 1 // [10, 1]
}
面对对象
// oop
class Person {
var name = ""
var age = 0
fun eat() {
println(name + "is eating. He is " + age + " years old.")
}
}
fun main() {
val p = Person(); // 没有了new关键字
p.age = 14
p.name = "mark"
p.eat()
}
// oop
// 默认所有非抽象类都是final,不能继承的,需要open修饰才能被继承。
open class Person(val name: String) {
}
// 主构造函数没有函数体,直接在类名后面定义
class Student(val sno: String, val grade: Int, /*没有val或者var,作用域仅在主构造函数中*/name: String): Person(name)/*子类必须调用父类构造函数*/ {
init {
// 主构造函数中的逻辑可以在这里写
println("sno is" + sno)
println("grade is" + grade)
}
// 次构造函数1, 调用了主构造函数
constructor(name: String) : this("", 0, name)
// 次构造函数2,调用了次构造函数1
constructor(): this("")
}
// 没有主构造函数,只有次构造函数的情况(继承的父类也不用加()了,因为没有定义主构造函数)
class Student1: Person {
/*由于没有主构造函数,因此无法用this调用主构造函数,只能用super调用父类的构造函数*/
constructor(name: String, age:Int):super(name) {
}
// 调用上面那个构造函数
constructor(): this("", 0)
}
// 接口
interface Study {
fun readBooks()
fun doHomework()
}
// 继承接口和实现类都统一使用:使用, 分隔
class Student3(name: String, age: Int): Person(name), Study {
override fun readBooks() {
TODO("Not yet implemented")
}
override fun doHomework() {
TODO("Not yet implemented")
}
// public: 所有类可见 private:仅内部类可见
// protected: 仅当前类和子类可见 internal:仅当前模块可见
private fun a() {
}
}
fun main() {
val s = Student("20182211", 2, "mark")
}