Android Kotlin 基础详解

news2024/12/23 13:02:42

1,基础语法

1.1 可变变量与不可变变量

可以多次赋值的变量是可变变量,用关键字var表示:

var <标识符> : <类型> = <初始化值>  注意,在kotlin中成员变量不会赋默认值,不像java一样,必须手动添加默认值。
var name : String ="yuanzhen"
name ="yuanzhen1"
var age : Int =20
age =30
println("name:$name,age:$age")
输出:
name:yuanzhen1,age:30

只能赋值一次的变量,是不可变变量,用关键字val表示,类似于java里面的final:

val <标识符> : <类型> = <初始化值> 注意,在kotlin中成员变量不会赋默认值,不像java一样,必须手动添加默认值。

1.2类型推导

kotlin可以根据传入的值,自动推导出变量类型:

var name ="yuanzhen"  //类型推导
name ="yuanzhen1"
var age =20  //类型推导
age =30

1.3函数 方法

kotlin中的Unit相当于java中的void ,如果函数的返回值为Unit,可以不用写返回值

kotlin中使用fun关键字定义函数

定义一个有参数和返回值的函数:

fun test(name1:String ,name2:String):String{
    return name1+name2
}

   调用:

println(test("yuan","zhen"))
//输出 yuanzhen

   也可以根据类型推导,直接写成:

fun test(name1:String ,name2:String) =name1+name2

  可变参数用关键字vararg表示:

fun lenMethod(vararg value: Int) {
    for (i in value) {
        println(i)
    }
}

调用:

lenMethod(1, 2, 3, 4, 5, 6, 7)

1.4字符串

在kotlin中,$表示一个变量名或者变量值,$name 表示变量值,如果变量值有多个,可以写为:${name1+name2}

var name ="yuanzhen1"  //类型推导
var name1 ="yuanzhen"
println("${name+name1}")

输出:yuanzhen1yuanzhen

换行:""" """  自己不用关心换行:

val infoMesage = """
    AAAAAAAAAAA
    BBBBBBBBBBB
    CCCCCCCCCCC
    DDDDDDDDDDD
    EEEEEEEEEEE
"""  // 前置空格
println(infoMesage)
val infoMesage2 = """
    AAAAAAAAAAA
    BBBBBBBBBBB
    CCCCCCCCCCC
    DDDDDDDDDDD
    EEEEEEEEEEE
""".trimIndent()  // 没空格
println(infoMesage2)
val infoMesage3 = """
    ?AAAAAAAAAAA
    ?BBBBBBBBBBB
    ?CCCCCCCCCCC
    ?DDDDDDDDDDD
    ?EEEEEEEEEEE
""".trimMargin("?")  // 没空格 控制?
println(infoMesage3)

输出:


    AAAAAAAAAAA
    BBBBBBBBBBB
    CCCCCCCCCCC
    DDDDDDDDDDD
    EEEEEEEEEEE

AAAAAAAAAAA
BBBBBBBBBBB
CCCCCCCCCCC
DDDDDDDDDDD
EEEEEEEEEEE
AAAAAAAAAAA
BBBBBBBBBBB
CCCCCCCCCCC
DDDDDDDDDDD
EEEEEEEEEEE

1.5 null检查机制

在kotlin中,如果你这么定义一个变量,一定会报错的

因为这是kotlin特有的机制,不允许直接赋空值。那么要怎么做呢?

var age:Int?=null

加个?的意思就相当于 我发出了一个广播,告诉所有人这个值可能是空的,必须要有处理措施。

第一种处理措施:

var age:Int?=null
val i = age?.and(2)
println("$i")

输出:null

age?.and(2)的意思就是如果age是null,那就不执行?后面的内容了

第二种处理措施:

var age:Int?=null
age!!.and(2)

!!的意思就是我不管,我就强行执行and方法,出了事我负责。

第三种处理措施:

就跟java一样,自己判断处理

var age:Int?=null
if(age !=null){
    age.and(2)
}

1.6 区间

区间用..来表示

// 1 到 9
for (i in 1..9) {
    println(i)
}

输出 1 2 3 4 5 6 7 8 9

那如果这样写呢?

for (i in 9..1) {
    println(i)
}

注意:这样是不会输出的,因为没有9到1这种写法,那如果非要输出9到1呢?

for (i in 9 downTo 1) {
    println(i)
}

要用downTo

还可以指定步长:

for (i in 1..20 step 2) {
   println(i)
}

输出:1 3 5 7 9 11 13 15 17 19    每隔2输出一个值

排除最后一个元素:

for (i in 1 until 10) {
    println(i)
}

输出:1 2 3 4 5 6 7 8 9 

2, 比较与数组

2.1比较

在java中比较两个字符串,用equls来比较,但是在kotlin中,用==来比较字符串的值

val name1: String = "张三"
val name2: String = "张三"

println(name1 == name2)

比较对象地址用===表示

// ---  比较对象地址
val test1:Int? =  10000
val test2:Int? =  10000
println(test1 === test2)

输出false

2.2 数组

在java中数组有三种创建方式:

int[] array  = {1,2,3};
int[] array1 = new int[3];
int[] array2 = new int[]{7,8,9};

在kotlin中 数组有两种方式:

第一种:

val numbers = arrayOf(1, 2, 3, 4, 5, 6, 7, 8)

第二种:

val numbers2 = Array(10,  {value: Int -> (value + 200) })
for (value in numbers2) {
    println(value)
}

输出:

200
201
202
203
204
205
206
207
208
209

为什么会这样呢? 因为value的默认值是0,之后会依次加一。

3,条件控制

比较大小值,可以这样写:

val number1: Int = 99
val number2: Int = 88
// 表达式 比 大小 最大值
val maxValue = if (number1 > number2) number1 else number2
println(maxValue)

输出99 

如果要执行多行代码,还可以这样写:

val max: Int = if (number1 > number2) {
    println("number1是最大的")
    number1
} else {
    println("number2是最大的")
    number2
}

注意:返回值不需要加return关键字

when相当于java中的switch case,只不过用法更加灵活

用于某个值:

val number5 = 5
when(number5) {
    1 -> println("一")
    2 -> println("二")
    3 -> println("三")
    4 -> println("四")
    5 -> println("五")
    else -> println("其他")
}

用于区间:

val number = 700
when(number) {
    in 1..100 -> println("1..100")
    in 200..500 -> println("200..500")
    else -> println("其他")
}

用于执行多行代码 并且有返回值:

val number = 3
val result = when (number) {
    1 -> {
        println("很开心")
        "今天是星期一"
        99
    }
    2 -> {
        println("很开心")
        "今天是星期二"
        88
    }
    3 -> {
        println("很开心")
        "今天是星期三"
        true
        100
    }
    else -> 99
}

4,循环与标签

4.1标签

自定义标签:在kotlin中,我们可以自定义一个标签,用来控制程序的执行流程等

yuanzhen@ for (i in 1..20) {
    for (j in 1..20) {
        println("i:$i, j:$j")
        if (i == 5) {
            // break // j循环 给break
            break@yuanzhen // i循环 给break
        }
    }
}

一个类中自带的标签:

class Yuan {

    val I = "aa"

    fun show() {
        println(I)
        println(this.I)
        println(this@Yuan.I)
    }

}

4.2循环

在kotlin中,要遍历一个list,通常有三种方式:

var items  = listOf<String>("aaa", "bbb", "ccc")

方式一:

for (item in items) {
    println(item)
}

方式二:

items.forEach {
    println(it)
}

方式三:

for (index in items.indices) {
    println("下标:$index,  对应的值:${items[index]}")
}

5,类与对象

5.1类的创建

在kotlin中,创建一个类,如果前面不写修饰符,默认就是public final 

// 默认就是public final
class Empty

这样是不能被继承的,要想被继承,就必须加上open

open class Person{}

5.2构造函数

在java中,会有一个默认的构造函数,并且可以重载无数个构造函数。

但是在kotlin中,它会有一个默认的主构造函数,其余的都是次构造。

上面的Person类,相当于有一个默认的主构造:

open class Person() // 主构造
{

}

那如果我们要给主构造增加一个参数呢?

open class Person(id: Int) // 主构造
{
}

那如果还要增加好几个次构造呢?

open class Person(id: Int) // 主构造
{

    // 次构造
    constructor(id: Int, name: String) : this(id) {

    }

    // 次构造
    constructor(id: Int, sex: Char) : this(id) {

    }

    // 次构造
    constructor() : this(222) {

    }

}

次构造必须继承主构造,同时把参数传给主构造

在使用时,可以这么用:

val person = Person() // 次构造
val person2 = Person(23456) // 主构造
Person(234, "yy") // 次构造
Person(234, 'M') // 次构造

5.3类的继承

继承父类用:表示

class Student(id: Int) : Person(id) // 主构造
{
    // 再Kotlin 全部都是没有默认值的

    // 再Java 成员有默认值,但是方法内部没有默认值

    // lateinit 懒加载  没有赋值 就不能使用,否则报错
    lateinit var name : String
    var age: Int = 0
}

5.4接口

在kotlin中,接口和抽象类默认都是open的

interface Callback {

    fun callbackMethod() : Boolean

}
interface Callback2 {

    fun callbackMethod() : Boolean

}
abstract class Person : Callback , Callback2 {

    abstract fun getLayoutID() : Int

    abstract fun initView()

}
class Student : Person() {

    override fun getLayoutID(): Int = 888

    override fun initView() { }

    override fun callbackMethod(): Boolean  = false
}

与java差别不大

5.5data数据类

数据类是kotlin中独有的,在java中,我们要写数据类,通常会手写很多属性和方法等。

在kotlin中,我们只需要用数据类定义属性就可以,不用关心get,set等方法,内部会自动帮我们生成。

// 会自动生成get set 构造 equals hashCode toString copy
data class User(val id: Int, val name: String, val sex: Char)
val user = User(99, "lisi", 'M')
//copy 函数
val(myID, myName, mySex) = user.copy()
println("myID:$myID, myName:$myName, mySex:$mySex")

5.6单例

在kotlin中,object只实例一次,相当于单例

object MyEngine {

    fun m() {
        println("M run")
    }

    fun show() {
        println("我就只有一个实例")
    }
}

companion :意思是同伴对象。相当于java的static.

下面来看一下kotlin中的单例模式怎么写:

方式一:

class NetManager {

    // 只有一个实例
    object Holder {

        val instance = NetManager()

    }

    // 看不到 static  可以 派生操作
    companion object {

        // 全部都是  相当于 Java static

        fun getInstance() : NetManager = Holder.instance
    }

    fun show(name: String) {
        println("show:$name");
    }

}

方式二:

class NetManager2 {

    companion object {

        private var instance: NetManager2? = null

        // 返回值:允许你返回null
        fun getInstance(): NetManager2? {
            if (instance == null) {
                instance = NetManager2()
            }

            // 如果是null,也返回回去了
            return instance

            // 第二种补救: 我来负责 instance 肯定不为null
            // return instance!!
        }

    }


    fun show(name: String) {
        println("show:$name");
    }

}

5.7嵌套类

嵌套类,就是在类的内部又写了一个类,但是它不是内部类,拿不到外部类的成员。

class Sub {
    fun show() {
        println()
    }
    class A {
        class B {
            class C {
            }
        }
    }
}

5.8内部类

在kotlin中,内部类用关键字inner来表示。

class Sub {
    fun show() {
        println()
    }
    class A {
        class B {
            class C {
            }
        }
    }
   }
    // 这个才是内部类
    inner class Sub2 {
        fun show() {
            println(I)
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1018232.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

时间复杂度讲解(数据结构)

目录 引言 什么是数据&#xff0c;结构和算法 时间复杂度的概念 如何计算时间复杂度 总结 引言 hello大家好&#xff0c;我是boooooom君家宝。在前期的博客中博主呢对c语言的一些重要知识点进行了讲解&#xff0c;接下来博主的博客内容将为大家呈现的是数据结…

JavaScript:二进制数组【笔记】

二进制数组【ArrayBuffer对象、Type的Array视图和DataView视图】JavaScript操作二进制数据的一个接口。 这些接口原本是和WebGL有关【WebGL是浏览器与显卡之间的通信接口】&#xff0c;为了满足JavaScript与显卡之间大量、实时数据交换&#xff0c;那么JavaScript和显卡之间的…

认识面向对象-PHP8知识详解

面向对象编程&#xff0c;也叫面向对象程序设计&#xff0c;是在面向过程程序设计的基础上发展而来的&#xff0c;它比面向过程编程具有更强的灵活性和扩展性。 它用类、对象、关系、属性等一系列东西来提高编程的效率&#xff0c;其主要的特性是可封装性、可继承性和多态性。…

2024届河南硕士暑期实习经验分享---招商银行篇

本期的实习经验分享&#xff0c;采访到了我的一位优秀的师弟&#xff0c;师弟于今年成功被郑州招商银行信息技术岗录取进行实习&#xff0c;下面他将使用第一人称的方式分享自己寻找实习过程中的一些经验、需要避的坑和在招商银行实习过程中的一些经历&#xff0c;为后续师弟师…

2023.9.11 关于传输层协议 UDP和TCP 详解

目录 UDP协议 TCP协议 TCP十大核心机制 确认应答 超时重传 连接管理&#xff08;三次握手 四次挥手&#xff09; 滑动窗口 流量控制 拥塞控制 延时应答 捎带应答 面向字节流 粘包问题 TCP 中的异常处理 经典面试题 对比 TCP 和 UDP 如何使用 UDP 实现可靠传…

l8-d19 广播与组播

一、广播 1.概念 数据包发送方式只有一个接受方&#xff0c;称为单播 如果同时发给局域网中的所有主机&#xff0c;称为广播 只有用户数据报(使用UDP协议)套接字才能广播 广播地址 一个网络内主机号全为1的IP地址为广播地址 发到该地址的数据包被所有的主机接收 255.25…

Linux学习第14天:Linux设备树(一):枝繁叶茂见晴天

本节笔记主要学习了Linux设备树相关知识点&#xff0c;由于内容较多&#xff0c;打算分两天进行总结。今天着重学习Linux设备树&#xff0c;主要包括前三节内容&#xff0c;分别是概念、格式和语法。 本节思维导图内容如下&#xff1a; 一、什么是设备树 设备树可以用一个图来进…

HJ61 放苹果

题目&#xff1a; HJ61 放苹果 题解&#xff1a;递归 f(m,n)表示将m个苹果放在n个盘子中所有的放法。 当n > m时&#xff0c;一定有盘子空着&#xff0c;等效于将m个苹果放到m个盘子中&#xff0c;即f(m,n) f(m,m)当 n < m时&#xff0c; 没有空盘子&#xff0c;那么…

LinkedList 源码分析

LinkedList 是一个基于双向链表实现的集合类。 LinkedList 插入和删除元素的时间复杂度 头部插入/删除&#xff1a;只需要修改头结点的指针即可完成插入/删除操作&#xff0c;因此时间复杂度为 O(1)。尾部插入/删除&#xff1a;只需要修改尾结点的指针即可完成插入/删除操作…

【玩玩Vue】通过vue-store实现枚举管理,用于下拉选项和中英文翻译等

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 一、store基础用法1.在src下新建store文件夹&#xff0c;在store下新建module文件夹2.在module下新建enums.js文件3.在store下新建getters.js…

Mybatis学习笔记3 在Web中应用Mybatis

Mybatis学习笔记2 增删改查及核心配置文件详解_biubiubiu0706的博客-CSDN博客 技术栈:HTMLServletMybatis 学习目标: 掌握mybatis在web应用中如何使用 Mybatis三大对对象的作用域和生命周期 关于Mybatis中三大对象的作用域和生命周期、 官网说明 ThreadLocal原理及使用 巩…

【古诗文网登录】

文章目录 古诗文网简介python登录 古诗文网简介 古诗文网登录界面 模拟登录两大难点 __VIEWSTATE、__VIEWSTATEGENERATOR两个动态参数验证码 python登录 1、解析登录界面&#xff0c;获取__VIEWSTATE、__VIEWSTATEGENERATOR参数2、获取登陆界面验证码图片&#xff0c;输入…

爬虫 — 自动化爬虫 Selenium

目录 一、介绍二、对比三、安装四、简单使用五、定位元素1、By.ID2、By.CLASS_NAME3、By.NAME4、By.TAG_NAM5、By.XPATH 六、操作元素1、在输入框输入内容并搜索2、打开网站搜索音乐并播放 七、Cookie 操作1、获取所有的 Cookie2、根据 Cookie 的 name 获取 Cookie3、删除某个 …

《低代码指南》——低代码+AI,驱动企业数字资产保值增值

各位嘉宾,大家上午好!非常荣幸能借助钛媒体数字价值峰会这个平台跟大家交流。 了解奥哲的朋友知道,奥哲是国内第一家官宣聚焦低代码领域,并且以低代码定位获得融资的数字化企业。 过去两三年,低代码得到了飞速发展,我在此想跟各位分享下我们在过去实践过程中的一些发现,…

Java“牵手”速卖通商品列表页数据采集+速卖通商品价格数据排序,速卖通API接口申请指南

速卖通是阿里巴巴旗下的面向国际市场打造的跨境电商平台&#xff0c;被称为国际版淘宝&#xff0c;速卖通面向海外买家客户&#xff0c;通过支付宝国际账户进行担保交易&#xff0c;并使用国际物流渠道运输发货&#xff0c;是全球第三大英文在线购物网站。 速卖通商品列表数据…

【资源监视器】设备占用,强制弹出移动硬盘

设备占用&#xff0c;强制弹出移动硬盘 任务管理器中找到资源监视器 资源监视器&#xff1a;找到CPU 输入磁盘&#xff1a;如H: , 点击旁边的刷新 结束句柄 右键

CorelDRAW 2023怎么把图片转化为手绘素描风 简单几步轻松搞定

CorelDRAW 2023是一款非常好用的设计类软件&#xff0c;软件拥有非常多强大又好用的功能&#xff0c;可以帮助设计师快速创造出想要的效果&#xff0c;今天我们就来给大家介绍一下CDR的“素描”艺术笔触。它可以帮助用户快速将普通的图片快速转换成类似素描的风格&#xff0c;在…

AMD GPU 内核驱动分析(二)-gpu_sched

AMDGPU驱动模块的依赖关系如下图,gpu_sched.ko位于GPU驱动架构的中间层&#xff0c;主要负责对应用发送下来的渲染和计算等命令进行调度&#xff1a; 编译gpu_sched.ko 模块源码位于linux-x.x.xx/drivers/gpu/drm/scheduler下&#xff0c;通过CONFIG_DRM_SCHED项配置编译。从M…

更新至2021年,互联网相关指标数据

更新至2021年&#xff0c;互联网相关指标数据 1、来源&#xff1a;国家统计J和各省NJ 2、指标&#xff1a;域名数、网站数、网页数、互联网宽带接入端口、互联网宽带接入用户、城市宽带接入用户、移动互联网用户、移动互联网接入流量、联网上网人数 3、范围&#xff1a;31省…

四、日志编写 —— TinyWebServer

日志编写 —— TinyWebServer 一、 前言 上期已经写完lock类的编写。这期是日志的编写。 对于日志需要弄懂几个基本概念才可以更好的理解和编写日志。 什么是日志&#xff1f;常用的日志级别有哪些&#xff1f;日志的基本格式是什么&#xff1f;异步日志类刷新缓冲区的作用同…