目录
在android studio上学习kotlin
在android studio中创建一个kotlin语言的android项目,创建一个.kt文件learn。

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

结构如下

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

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