Android Kotlin 基础详解

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 = """AAAAAAAAAAABBBBBBBBBBBCCCCCCCCCCCDDDDDDDDDDDEEEEEEEEEEE
"""  // 前置空格
println(infoMesage)
val infoMesage2 = """AAAAAAAAAAABBBBBBBBBBBCCCCCCCCCCCDDDDDDDDDDDEEEEEEEEEEE
""".trimIndent()  // 没空格
println(infoMesage2)
val infoMesage3 = """?AAAAAAAAAAA?BBBBBBBBBBB?CCCCCCCCCCC?DDDDDDDDDDD?EEEEEEEEEEE
""".trimMargin("?")  // 没空格 控制?
println(infoMesage3)

输出:

AAAAAAAAAAABBBBBBBBBBBCCCCCCCCCCCDDDDDDDDDDDEEEEEEEEEEEAAAAAAAAAAA
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("很开心")"今天是星期三"true100}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循环 给breakbreak@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 : Stringvar 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() : Intabstract fun initView()}
class Student : Person() {override fun getLayoutID(): Int = 888override 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 staticfun getInstance() : NetManager = Holder.instance}fun show(name: String) {println("show:$name");}}

方式二:

class NetManager2 {companion object {private var instance: NetManager2? = null// 返回值:允许你返回nullfun 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.rhkb.cn/news/140623.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

83、SpringBoot --- 下载和安装 MSYS2、 Redis

★ 下载和安装MSYS2&#xff08;作用&#xff1a;可在Windows模拟一个Linux的编译环境&#xff09; 得到Redis的编译环境——在Linux平台上&#xff0c;这一步可以省略。&#xff08;1&#xff09;登录MSYS2官网&#xff08;http://repo.msys2.org/distrib/ &#xff09;下载M…

Java 项目-基于 SpringBoot+Vue的疫情网课管理系统

文章目录 第一章 简介第二章 技术栈第三章 系统分析3.4.2学生用例 第四章 系统设计第五章 系统实现5.1学生功能模块5.2管理员功能模块5.3教师功能模块 六 源码咨询 第一章 简介 疫情网课也都将通过计算机进行整体智能化操作&#xff0c;实现的功能如下。 例如 管理员&#x…

【力扣-每日一题】LCP 06. 拿硬币

class Solution { public:int minCount(vector<int>& coins) {int res0;for(auto i:coins){resi/2;res(i%2)?1:0;}return res;} };

2023 年前端 UI 组件库概述,百花齐放!

UI组件库提供了各种常见的 UI 元素&#xff0c;比如按钮、输入框、菜单等&#xff0c;只需要调用相应的组件并按照需求进行配置&#xff0c;就能够快速构建出一个功能完善的 UI。 虽然市面上有许多不同的UI组件库可供选择&#xff0c;但在2023年底也并没有出现一两个明确的解决…

《计算机视觉中的多视图几何》笔记(10)

10 3D Reconstruction of Cameras and Structure 本章主要描述了如何利用2张图片来恢复相机的参数以及物体在三维空间中的形状。 文章目录 10 3D Reconstruction of Cameras and Structure10.1 Outline of reconstruction method10.2 Reconstruction ambiguity10.3 The proje…

批量、在线学习, 参数、非参数学习

批量学习&#xff08;Batch Learning&#xff09;和在线学习&#xff08;Online Learning&#xff09; 批量学习 批量学习的概念非常容易理解&#xff0c;我们之前介绍的许多机器学习算法&#xff0c;如果没有特殊说明&#xff0c;都可以采用批量学习的方式。批量学习的过程通…

【C++】布隆过滤器简单操纵模拟以及常见题目

&#x1f30f;博客主页&#xff1a; 主页 &#x1f516;系列专栏&#xff1a; C ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ &#x1f60d;期待与大家一起进步&#xff01; 文章目录 前言一、求下标仿函数的建议二、布隆过滤器代码面试题1.近似算法&#xff1a;2.精确算…

CompletableFuture-FutureTask

2. CompletableFuture 语雀 2.1 Future接口理论知识复习 Future接口&#xff08;FutureTask实现类&#xff09;定义了操作异步任务执行一些方法&#xff0c;如获取异步任务的执行结果、取消异步任务的执行、判断任务是否被取消、判断任务执行是否完毕等。 举例&#xff1a;…

Cortex-M3/M4之SVC和PendSV异常

一、SVC异常 SVC(系统服务调用&#xff0c;亦简称系统调用)用于产生系统函数的调用请求。例如&#xff0c;操作系统不让用户程序直接访问硬件&#xff0c;而是通过提供一些系统服务函数&#xff0c;用户程序使用 SVC 发出对系统服务函数的呼叫请求&#xff0c;以这种方法调用它…

“源启2.0”:从自上而下的解构,到自下而上的重构

从垂直打穿、到应用重构&#xff0c;中电金信赋能行业数字化转型之路既“向下走”、也“向上看”。“向上”先理解和吃透客户的企业战略&#xff0c;进而自上而下地将企业战略拆解为业务架构&#xff0c;“向下”再将业务架构拆解为应用架构和数据架构&#xff0c;并进一步对齐…

【Acwing1027】方格取数(动态规划)题解

题目描述 思路分析 错误思路&#xff1a; 贪心法&#xff0c;先走一次求出最大值&#xff0c;把走过的路上面的数值清零&#xff0c;然后用同样的方法再走一遍求最大值&#xff0c;然后让这两个最大值相加就是最后的结果。 很多人在看到这个题目的时候会有上面的思路&#x…

Jmeter接口测试

前言&#xff1a; 本文主要针对http接口进行测试&#xff0c;使用Jmeter工具实现。 Jmter工具设计之初是用于做性能测试的&#xff0c;它在实现对各种接口的调用方面已经做的比较成熟&#xff0c;因此&#xff0c;本次直接使用Jmeter工具来完成对Http接口的测试。 1.介绍什么是…

停车场系统源码

源码下载地址&#xff08;小程序开源地址&#xff09;&#xff1a;停车场系统小程序&#xff0c;新能源电动车充电系统&#xff0c;智慧社区物业人脸门禁小程序: 【涵盖内容】&#xff1a;城市智慧停车系统&#xff0c;汽车新能源充电&#xff0c;两轮电动车充电&#xff0c;物…

Linux下ThinkPHP5实现定时器任务 - 结合crontab

实例一&#xff1a; 1.在/application/command创建要配置的PHP类文件&#xff0c;需要继承Command类&#xff0c;并重写configure和execute两个方法&#xff0c;例如: <?php namespace app\command; use think\console\Command; use think\console\Input; use think\cons…

“降本”是关键,FCU1104打造低成本工商业储能EMS

在不久前举行的EESA中国国际储能展上&#xff0c;“工商业储能”成为了热度最高的话题之一&#xff0c;几乎每家展出工商业储能系统的展商都收获了大量观众的驻足围观&#xff0c;热度非凡。究竟是怎样的原因让工商业储能如此瞩目呢&#xff1f; 通过与多家储能厂家沟通并查阅…

【音视频】ffplay源码解析-PacketQueue队列

包队列架构位置 对应结构体源码 MyAVPacketList typedef struct MyAVPacketList {AVPacket pkt; //解封装后的数据struct MyAVPacketList *next; //下一个节点int serial; //播放序列 } MyAVPacketList;PacketQueue typedef struct PacketQueue {MyAVPacketList …

论文精读(2)—基于稀疏奖励强化学习的机械臂运动规划算法设计与实现(内含实现机器人控制的方法)

目录 1.作者提出的问题及解决方向 2.延深-用如何用强化学习对机器人进行控制 2.1思路 2.2DQN和DDPG在机器人控制中的应用 3.解决方案 3.1思路 3.2实验 3.3创新点 4.展望 1.作者提出的问题及解决方向 目的&#xff1a;使机械臂在非结构化环境下实现端到端的自主学习控制…

MySQL学习笔记6

MySQL数据库如何存放数据&#xff1f; 注明&#xff1a;我们平常说的MySQL&#xff0c;其实主要指的是MySQL数据库管理软件。 一个MySQL DBMS可以 同时存放多个数据库&#xff0c;理论上一个项目就对应一个数据库。 如博客项目blog数据库&#xff0c;商城项目shop数据库&#…

(Vue2)智慧商城项目

新增两个目录api、utils api接口模块&#xff1a;发送ajax请求的接口模块 utils工具模块&#xff1a;自己封装的一些工具方法模块 第三方组件库vant-ui PC端&#xff1a;element-ui&#xff08;element-plus&#xff09; ant-design-vue 移动端&#xff1a;vant-ui Mint UI…

【计算机网络 - 自顶向下方法】计算机网络和因特网

目录 1. What is the Internet? 1.1 因特网的具体构成 1.2 因特网的功能 2. Network core 2.1 基本介绍 2.2 分组交换 2.2.1 序列化时延 2.2.2 排队延迟和丢包 2.2.3 分组交换的优缺点 2.3 电路交换 2.3.1 基本概念 2.3.2 电路交换网络中的复用 2.3.3 电路交换文件…