kotlin学习 基础知识一览
目录
- 在android studio上学习kotlin
- 变量
- 函数
- 逻辑控制
- if条件语句
- when条件语句
- 循环语句
- for-in循环
- 区间
- 类与对象
- 继承与构造函数
- open关键字
- 主构造函数与次构造函数
- 主构造函数
- 次构造函数
- 接口
- 接口的基本使用
- 函数的可见性修饰符
- 数据类与单列类
- 数据类
- 单例类
在android studio上学习kotlin
在android studio中创建一个kotlin语言的android项目,创建一个.kt文件learn。

编写一个main()函数。
package com.bz.yh.xd.testkotlinclass Learn {
}fun main(){println("hello k")
}
点击这个箭头,就运行了。

结构如下

变量
val 用来声明一个可变的变量,这种变量在初始赋值之后就再也不能重新赋值。
var用来声明一个可变的变量,这种变量在初始赋值后仍然可以再被重新赋值。
fun main(){var a = 1println("a = " + a)
}
输出结果
a = 1Process finished with exit code 0
上面会自动推导出变量a的类型,如果这个变量是延迟赋值的话,kotlin就无法自动推导了,需要显示的声明。
val a: Int = 1
kotlin没有基本数据类型,看下图。

函数
语法规则
fun methodName(param1 :Int ,param2 Int): Int{returon 0
}
fun是定义函数的关键字。
methodName自定义的函数名称。
括号里的是参数,参数声明格式是“参数名:参数类型”。
参数括号后面那部分是可选的,用于声明返回的类型。如果不需要返回类型,则可以直接不写。
示例:
fun largeN(num1: Int, num2: Int): Int {return max(num1,num2)
}fun main() {val a = largeN(10,20);println("max = = $a")
}
打印结果
max = = 20Process finished with exit code 0
语法糖,当一个函数中只有一行代码时,kotlin允许我们不必编写函数体,直接将唯一的一行代码写函数定义的尾部,中间用等号连接即可。
fun largeN2(num1: Int, num2: Int): Int = max(num1,num2)
能推导出返回类型,可以省略返回类型
fun largeN2(num1: Int, num2: Int) = max(num1, num2)
逻辑控制
if条件语句
与java不同的事是kotlin的if可以有返回值。
fun largeN3(num1: Int, num2: Int): Int {var value = 0if(num1 > num2){value = num1;}else{value = num2}return value
}
有返回值的if
fun largeN4(num1: Int, num2: Int): Int {var value = if (num1 > num2) {num1} else {num2}return value
}
去掉value
fun largeN4(num1: Int, num2: Int): Int {return if (num1 > num2) {num1} else {num2}
}
使用=
fun largeN4(num1: Int, num2: Int) = if (num1 > num2) {num1
} else {num2
}
when条件语句
先用if实现
fun getType(testType: Int): String {return if (testType == 100) {"single"} else if (testType == 110) {"mul"} else {"fill"}
}
when实现
fun getType2(testType: Int): String {return when (testType) {100 -> "single"110 -> "mul"else -> "fill"}
}
使用=
fun getType2(testType: Int) = when (testType) {100 -> "single"110 -> "mul"else -> "fill"
}
语法格式
when (参数) {匹配值-> {执行逻辑}匹配值-> {执行逻辑}匹配值-> {执行逻辑}}
还能类型匹配
fun checkNumber(num: Number) {when (num) {is Int -> println("is Int")is Double -> println("is Int")else -> println("1111 222 333")}
}
无参数的when
可以对变量进行特殊处理
Kotlin中判断字符串或对象是否相等可以直接使用==关键字
fun getScore(name: String) = when {name.startsWith("tom") -> 86name == "Jim" -> 86else -> 0
}
循环语句
while循环与java中的没有区别。
for-in循环
区间
创建一个0到10的区间。包含两端。
…是创建区间的关键字
val range =0..10
示例
fun main() {for ( i in 0..10){println(i)}
}
结果
0
1
2
3
4
5
6
7
8
9
10Process finished with exit code 0
创建一个左闭右开的区间,使用until
fun main() {for ( i in 0 until 10){println(i)}
}
结果
0
1
2
3
4
5
6
7
8
9Process finished with exit code 0
使用step关键字跳过某些数据
fun main() {for ( i in 0 until 10 step 2){println(i)}
}
结果
0
2
4
6
8Process finished with exit code 0
…和until关键字要求区间的左端必须小于区间的右端,是一个升序。
创建一个降序的区间,要使用downTo关键字。
fun main() {for ( i in 10 downTo 0){println(i)}
}
结果
10
9
8
7
6
5
4
3
2
1
0Process finished with exit code 0
类与对象
kotlin中创建类也是使用class关键字来创建。
class User {var id = -1;var name = "";fun login() {println("name is " + name + ",id is " + id)}
创建对象
val u = User();
示例
fun main() {val u = User();u.name ="Test"u.id = 1520u.login();
}
结果
name is Test,id is 1520Process finished with exit code 0
继承与构造函数
open关键字
在kotlin中,默认所有非抽象类都是不可以被继承的。
要想被继承需要使用open关键字。
open class Person {var age = 0
}
user继承person使用:
class User : Person() {var id = -1;var name = "";fun login() {println("name is " + name + ",id is " + id)}
}
主构造函数与次构造函数
主构造函数
主构造函数没有函数体。直接定义在类名的后面。
class User(val id: Int, val name: String) : Person() {fun login() {println("name is " + name + ",id is " + id)}
}
上面实例化时,就需要穿参数。
fun main() {val u = User(1520,"Test")u.login();
}
如果需要再主构造函数中,处理一些事情,可以在init结构体中。
class User(val id: Int, val name: String) : Person() {init {println("init")}.......
}
次构造函数
当一个类既有主构造函数又有次构造函数,所有的次构造函数都必须调用主构造函数。
次构造函数通过construct关键字类 定义。
父类
open class Person(val age : Int) {}
子类
class User(val id: Int, val name: String, age: Int) : Person(age) {constructor(age: Int):this(0,"Test",age)constructor():this(10)
}
第一个次构造函数集体户搜age参数,通过this关键字调用了主构造函数,并将id置0,name置Test。
第二个次构造函数不接受任何的参数,通过this关键字调用定义的第一个次构造函数关键字。
类中只有次构造函数,没有主构造函数。
open class Person(val age : Int) {}
Person没有括号
class User2 : Person {constructor(age: Int) : super(age)
}
接口
接口的基本使用
一个类只能继承一个父类,可以实现任意多个接口。
创建接口
interface Study {fun readBooks()fun drawPictures()
}
通过:来实现接口,继承也是如此。接口后面不需要加括号。使用override 关键字来重写父类或者实现接口中的函数。
class Student(val name: String, val sno: Int) : Study {override fun readBooks() {println("name is " + name)}override fun drawPictures() {println(name + "draw Pictures ")}
}
kotline可以对接口中的方法进行默认实现。当一个类去实现这个接口,drawPictures函数可以自由选择实现或者不实现。
interface Study {fun readBooks()fun drawPictures(){println("default draw Pictures")}
}
函数的可见性修饰符
函数的可见性修饰符public、private、protected、internal。
private修饰符与java中作用一样,表示只对当前类内部可见。
public修饰符与java中作用一样,对所有类可见,kotlin中public修饰符是默认项。
protected表示只对当前类和子类可见。
internal表示对同一模块的类可见。
数据类与单列类
数据类
用java和kotlin创建word类
java版
public class Word {String enContent;String cnContent;public Word(String enContent, String cnContent) {this.enContent = enContent;this.cnContent = cnContent;}@Overridepublic boolean equals(Object o) {if (!(o instanceof Word word)) return false;return Objects.equals(enContent, word.enContent) && Objects.equals(cnContent, word.cnContent);}@Overridepublic int hashCode() {return Objects.hash(enContent, cnContent);}@Overridepublic String toString() {return "Word{" +"enContent='" + enContent + '\'' +", cnContent='" + cnContent + '\'' +'}';}
}
kotlin版,创建data class
data class Word(val enContent: String, val cnContent: String)
data是数据类的关键字。可以明显的看出来,减少了很多的工作量。
单例类
只需要把class改成object,就可以了。不需要私有化构造函数,也不需要提供getInstance()。kotlin会自动创建一个实例,并保证全局只会存在一个Singleton 。
示例
object Singleton {fun test() {println("test")}
}
使用
Singleton.test()
