kotlin学习 基础知识一览

目录

在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()
相关推荐
程序员卷卷狗12 小时前
JVM 调优实战:从线上问题复盘到精细化内存治理
java·开发语言·jvm
lly20240613 小时前
ASP Folder:深入解析其功能与使用技巧
开发语言
雪域迷影13 小时前
Go语言中通过get请求获取api.open-meteo.com网站的天气数据
开发语言·后端·http·golang·get
雨白13 小时前
StateFlow 与 SharedFlow:在协程中管理状态与事件
android·kotlin
WAsbry15 小时前
NFC开发系列专栏 - 第三篇:无界面NFC后台服务方案
android·程序员·架构
消失的旧时光-194315 小时前
WebView 最佳封装模板(BaseWebActivity + WebViewHelper)
android·webview
WAsbry15 小时前
NFC开发系列-第一篇:NFC开发基础与实战入门
android·程序员
WAsbry15 小时前
NFC开发系列 - 第二篇:NFC企业级架构设计与最佳实践
android·程序员·架构
ysdysyn15 小时前
C# 进程管理实战:检查与启动EXE程序的完整指南
开发语言·c#