背景
解释型语言。Kotlin运行前会先编译成class,再供java虚拟机解释执行
语法
变量
var b = 1//可变变量
val a = 1//不可变变量,对应final
//kotlin存在类型推导机制,上述a,b会默认为Int
var c: Int = 1//声明具体类型
基本类型:Kotlin不再存在基本类型,将全部使用对象类型
语句
//if与java相同,但可以包含返回值,if必须有else,不然会报错
fun max(a: Int, b: Int): Int{
return if(a > b) a else b
}
//return可以替换为赋值
fun max(a: Int, b: Int): Int = if(a > b) a else b
//Kotlin中==等价于Java的equals比较的时是对象里的内容, === 等价于Java的==,比较的为对象的引用
fun getScore(name: String) = if (name == "Tom") "不及格"
else if (name == "Jim") "及格"
else if (name == "Pony") "良好"
else if (name == "Tony") "优秀"
else "名字非法"
//when也必须实现else,否则报错.
//when表达式中每一个分支都由条件,箭头->和一个结果来表示
fun getScore(name: String) = when(name) {
"Tom" -> "不及格"
"Jim" -> "及格"
"Pony" -> "良好"
"Tony" -> "优秀"
else -> "名字非法"
}
//使用Boolean使when更加灵活
un getScore(name: String) = when {
name == "Tom" -> {
//进行一些处理
println("你好,我是Tom开头的同学")
"不及格"
}
name == "Jim" -> "及格"
name == "Pony" -> "良好"
name == "Tony" -> "优秀"
else -> "名字非法"
}
//when支持参数检查
fun checkNumber(num: Number) {
when (num) {
is Int -> println("Int")
is Double -> println("Double")
else -> println("others")
}
}
//循环语句,while与java没有区别
//区间的概念
val range = 0..10//区间代表[1,10]
for (i in range) {//或者直接for (i in 0..10)
}
for (i in 0 until 10) {//区间[0,10)
}
for (i in 0 until 10 step 2) {//步长为2
}
for (i in 10 downTo 1) {//降序
}
函数
//无参无返回值
fun test() {
}
//参数类型Int,返回值类型Int
fun add(a: Int, b: Int): Int{
return a + b
}
//可以将return关键字替换为赋值运算符
fun add(a: Int, b: Int): Int = a + b
//类型推导,返回值类型也可以忽略
fun add(a: Int, b: Int): a + b
//调用
val num = add(1,2)
类
//范例 创建一个Person类,main函数调用
class Person {
var name = ""
var age = 0
fun printInfo() {
}
}
fun main() {
val person = Person()
person.name = "zhangsan"
person.age = 20
person.printInfo()
}
继承
open class Person() {//open关键字才可以继承
}
class Student : Person() {
}
构造函数
class Student(name: String, age: Int, val number: String, val grade: Int) : Person(name, age) {
}
//创建Student对象
val student = Student("zhangsan", 20, "1234", 90)
//Kotlin提供了init结构体,主构造的逻辑可在init中处理
open class Person(val name: String, val age: Int) {
init {
println("name is" + name)
println("age is" + age)
}
}
//次构造(多个构造函数)
class Student(name: String, age: Int, val number: String, val grade: Int): Person(name, age) {
constructor(name: String, age: Int, number: String): this(name, age, number, 0) {//只初始化前三个参数
}
constructor(): this("", 0, "", 0) {
}
}
//无主构造函数
class Student : Person {
constructor(name: String, age: Int, number: String) : super(name, age) {
}
fun study() {
//name,age可使用
println(name + "is studying")
//使用number则会报错,若number是主构造的参数则可引用
}
}